Scheme 没有回复我需要的答案 (定义(校验和-2 ls) (如果(空?ls) 0 (let([n0]) (+(+n1))(*n(汽车ls))(校验和-2(cdr ls()()))

Scheme 没有回复我需要的答案 (定义(校验和-2 ls) (如果(空?ls) 0 (let([n0]) (+(+n1))(*n(汽车ls))(校验和-2(cdr ls()())),scheme,Scheme,好的,我有这个代码,它假设,如果我写对了,数字(n)应该在每次通过列表时增加一,所以n(实际上)应该像1234,但我希望n乘以列表的汽车 所有内容都加载,但当返回答案时,我得到0 谢谢 如果您的代码格式不同,您可能会更容易看到正在发生的事情: (define (checksum-2 ls) (if (null? ls) 0 (let ([n 0]) (+ (+ n 1))(* n (car ls))(checksum-2 (cdr ls))))) 在

好的,我有这个代码,它假设,如果我写对了,数字(n)应该在每次通过列表时增加一,所以n(实际上)应该像1234,但我希望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
n
的整数相加:

(define (checksum-2 ls)
  (if (null? ls) 
      0
      (let ([n 0])
        (+ (+ n 1))
        (* n (car ls))
        (checksum-2 (cdr ls)))))
(定义(和n)
(定义(求和辅助对象n a)

(如果(你看,我不知道怎么做。我不明白的是为什么我的函数忽略了数学而只返回0?你没有对算术计算的结果做任何事情。
checksum-2
函数唯一能返回的就是
0
,或者任何
(checksum-2(cdr ls))
返回。所以最终它总是返回
0
。那么需要更改什么呢?就像我已经做了几个小时了,但我什么都没有得到。这是递归调用的问题?好的,谢谢,嗯,我们将试着从演示编辑中找出它,但我们没有得到的是为什么我们只返回0。我们的数学算法很合理e对我们来说,但它就是不运行。:(@DwayneR.Fortune)你不知道你有多幸运,能学习Scheme。在我学习Scheme.learning Scheme之前,我是一名Java程序员(通过阅读本书)这是我第一次觉得自己真正在学习编程。如果你想为某家公司编写monkey代码,那就一定要学习Java。如果你想稍微睁开眼睛,就学习Scheme(然后是Python、Haskell、Scala、Prolog……)
(define (sum n)
  (define (sum-helper n a)
    (if (<= n 0)
        a
        (sum-helper (- n 1) (+ a n))))
  (sum-helper n 0))