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