4

好吧,我和我的朋友已经尝试过多次,但拒绝去找导师,因为他们所做的只是给我们答案,而这并不能帮助我们学习任何东西。

到目前为止,我可以获得代码来做两件事之一,返回列表的总和或返回列表本身,我们需要获取它,以便它返回列表和总和的最后一位。到目前为止,我们有两件事:

(define (add-checksum ls)
  (cond
    [(null? ls) 0]
    [else (+ (car ls) (add-checksum (cdr ls)))]))

(define (add-checksum-helper ls)
  (cond
    [(null? ls) 0]
    [else (cons (car ls) (add-checksum-helper (cdr ls)))]))

第一组代码进行加法并返回总和。第二个返回列表加上.0总和的最后一位数字应该去哪里?任何人都可以帮助我们吗?谢谢!

编辑:

(define (checksum ls)
  (append ls ((cdr (add-checksum ls)))))

(define (add-checksum ls)
  (cond
    [(null? ls) 0]
    [else (+ (car ls) (add-checksum (cdr ls)))]))

回报是:

(checksum '(4 5 6 7 8))
((4 5 6 7 8) . 30)

我们需要它返回(4 5 6 7 8 0)而不是(.30). 我们不知道如何获得0. 如果我们这样做,(cdr 30)我们会得到列表不是成对的。现在有什么建议吗?

4

2 回答 2

1

add-checksum过程很好,但是您可以通过使用原始列表中apply的过程来获得相同的结果。+

对于第二部分:是否有必要将校验和存储在最后一个位置?通过使用原始列表cons调用的结果,将它存储在第一个位置会简单得多。add-checksum

最后,如果您需要提取数字的最后一位,请使用n正整数尝试以下操作:

(remainder n 10)

例如:

(remainder 28 10)
> 8
于 2012-09-25T23:52:58.910 回答
0

听起来最简单的方法是使用两个单独的函数作为最终函数的助手;一个计算总和,一个将那个数字放在最后。

可能您的任务要求您只遍历列表一次,并在向下的过程中计算它——不过,这是一个有点虚假的要求,因为在任何一种情况下,渐近复杂度都是相同的。

于 2012-09-25T23:52:11.227 回答