Scheme 在方案中添加列表元素

Scheme 在方案中添加列表元素,scheme,Scheme,如何编写一个Scheme过程,将列表和数字作为参数,并使用尾部递归计算并返回列表中所有数字的总和 从开始到遇到数字m的第一个实例? (如果从未遇到,返回值将是所有元素的总和 在列表中。) 例如,(proc(列表123456)4)应该返回6。 我处理了这个过程及其基本情况,即如果列表为空,它将返回0。但是我需要另一个基本情况,当列表不包含作为参数给出的数字时,它返回列表元素的总和。因为这是家庭作业,所以这次我不会给你一个直接的答案。以下是需要完成的工作的总体思路,请填空: (define (add

如何编写一个Scheme过程,将列表和数字作为参数,并使用尾部递归计算并返回列表中所有数字的总和 从开始到遇到数字m的第一个实例? (如果从未遇到,返回值将是所有元素的总和 在列表中。) 例如,(proc(列表123456)4)应该返回6。
我处理了这个过程及其基本情况,即如果列表为空,它将返回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 ??? (+ ??? ???)))))