校验和计划

时间:2012-09-25 23:15:29

标签: scheme

好的,我和我的朋友已多次尝试这种情况并且拒绝去找导师,因为他们所做的就是给我们答案,这对我们学习任何东西都没有帮助。

截至目前,我可以让代码执行以下两项操作之一,返回列表的总和或返回列表本身,我们需要获取它以便它将返回列表和总和的最后一位数。以下是我们迄今为止所做的两件事:

(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)我们得到的列表不是一对。现在有什么建议吗?

2 个答案:

答案 0 :(得分:1)

add-checksum程序没问题,但您可以使用原始列表中的apply+程序获得相同的结果。

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

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

(remainder n 10)

例如:

(remainder 28 10)
> 8

答案 1 :(得分:0)

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

可能是你的作业要求你只遍历一次列表,并在下行时计算它 - 这是一个有点虚假的要求,因为渐近的复杂性在任何一种情况下都是相同的。