-2
(定义(校验和 2 ls)
  (如果(空?ls)
      0
      (让 ([n 0])
        (+ (+ n 1))(* n (car ls))(校验和-2 (cdr ls))))))

好的,我有这段代码,它假设,如果我写得对,数字(n)应该在每次通过列表时增加一,所以 n(实际上)应该像 1 2 3 4,但我想要 n 乘以列表的汽车。

一切都加载了,但是当返回答案时,我得到 0。

谢谢!

4

1 回答 1

1

如果您以不同的方式格式化代码,您可能会更容易看到发生了什么:

(define (checksum-2 ls)
  (if (null? ls) 
      0
      (let ([n 0])
        (+ (+ n 1))
        (* n (car ls))
        (checksum-2 (cdr ls)))))

let表单内部,表达式是按顺序计算的,但您没有使用其中任何一个的结果(最后一个除外)。简单地丢弃加法和乘法的结果。

在这种情况下,您需要做的是定义一个使用累加器并执行递归调用的新辅助函数。我猜这是家庭作业或学习练习,所以我不会给出完整的答案。

更新:作为您可能需要做的事情的演示,这里是 Scheme 中的一个类似函数,用于将整数从1to相加n

(define (sum n)
  (define (sum-helper n a)
    (if (<= n 0)
        a
        (sum-helper (- n 1) (+ a n))))
  (sum-helper n 0))

您应该能够使用类似的框架来实现您的checksum-2功能。

于 2012-09-26T02:32:24.660 回答