(定义(校验和 2 ls) (如果(空?ls) 0 (让 ([n 0]) (+ (+ n 1))(* n (car ls))(校验和-2 (cdr ls))))))
好的,我有这段代码,它假设,如果我写得对,数字(n)应该在每次通过列表时增加一,所以 n(实际上)应该像 1 2 3 4,但我想要 n 乘以列表的汽车。
一切都加载了,但是当返回答案时,我得到 0。
谢谢!
(定义(校验和 2 ls) (如果(空?ls) 0 (让 ([n 0]) (+ (+ n 1))(* n (car ls))(校验和-2 (cdr ls))))))
好的,我有这段代码,它假设,如果我写得对,数字(n)应该在每次通过列表时增加一,所以 n(实际上)应该像 1 2 3 4,但我想要 n 乘以列表的汽车。
一切都加载了,但是当返回答案时,我得到 0。
谢谢!
如果您以不同的方式格式化代码,您可能会更容易看到发生了什么:
(define (checksum-2 ls)
(if (null? ls)
0
(let ([n 0])
(+ (+ n 1))
(* n (car ls))
(checksum-2 (cdr ls)))))
在let
表单内部,表达式是按顺序计算的,但您没有使用其中任何一个的结果(最后一个除外)。简单地丢弃加法和乘法的结果。
在这种情况下,您需要做的是定义一个使用累加器并执行递归调用的新辅助函数。我猜这是家庭作业或学习练习,所以我不会给出完整的答案。
更新:作为您可能需要做的事情的演示,这里是 Scheme 中的一个类似函数,用于将整数从1
to相加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
功能。