Scheme 在方案中添加列表元素
如何编写一个Scheme过程,将列表和数字作为参数,并使用尾部递归计算并返回列表中所有数字的总和 从开始到遇到数字m的第一个实例? (如果从未遇到,返回值将是所有元素的总和 在列表中。) 例如,(proc(列表123456)4)应该返回6。Scheme 在方案中添加列表元素,scheme,Scheme,如何编写一个Scheme过程,将列表和数字作为参数,并使用尾部递归计算并返回列表中所有数字的总和 从开始到遇到数字m的第一个实例? (如果从未遇到,返回值将是所有元素的总和 在列表中。) 例如,(proc(列表123456)4)应该返回6。 我处理了这个过程及其基本情况,即如果列表为空,它将返回0。但是我需要另一个基本情况,当列表不包含作为参数给出的数字时,它返回列表元素的总和。因为这是家庭作业,所以这次我不会给你一个直接的答案。以下是需要完成的工作的总体思路,请填空: (define (add
我处理了这个过程及其基本情况,即如果列表为空,它将返回0。但是我需要另一个基本情况,当列表不包含作为参数给出的数字时,它返回列表元素的总和。因为这是家庭作业,所以这次我不会给你一个直接的答案。以下是需要完成的工作的总体思路,请填空:
(define (add-until lst num acc)
(if (or <???> ; if the list is null
(= <???> <???>)) ; or the current element equals `num`
acc ; then return the accumulator
(add-until ; else make a recursive call
<???> ; advance to the next element in list
num ; pass along the same `num`
(+ <???> <???>)))) ; update the accumulator with current element
或者,您可以定义两个过程-一个帮助器实现实际迭代并将累加器作为参数接收(这就是我上面概述的一个),另一个,它只接收两个参数,并且总是以
0
的初始值调用helper过程。斯卡尔·洛佩兹的答案是正确的。下面是相同代码的一个版本,使用了一个名为的let
,至少在我看来,它更容易阅读:
(define (add-until lst num)
(let loop ((lst lst)
(acc 0))
(if (or ???
(= ??? ???))
acc
(loop ??? (+ ??? ???)))))
然后就是我不明白尾部递归应该如何工作的地方。
(define (add-until lst num)
(let loop ((lst lst)
(acc 0))
(if (or ???
(= ??? ???))
acc
(loop ??? (+ ??? ???)))))