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