Recursion 方案中的倍数和

Recursion 方案中的倍数和,recursion,functional-programming,scheme,tail-recursion,Recursion,Functional Programming,Scheme,Tail Recursion,所以我对Scheme和函数式编程作为一个整体是非常陌生的。 我正试图编写一个程序,找出1000以下所有3或5的倍数之和。 这是我迄今为止的尝试: (define (sum-of-multiples n) ; Start = 0, End = n, Sum = 0. (get-sum 0 n 0) ) ; A recursive loop that starts at 0 and ends with given n (1000). (define (get-sum start end sum)

所以我对Scheme和函数式编程作为一个整体是非常陌生的。 我正试图编写一个程序,找出1000以下所有3或5的倍数之和。 这是我迄今为止的尝试:

(define (sum-of-multiples n)
; Start = 0, End = n, Sum = 0.
(get-sum 0 n 0)
)

; A recursive loop that starts at 0 and ends with given n (1000).
(define (get-sum start end sum)
   (cond
   ; Stopping case.
   ((= start end) sum)
   ; If start counter is divisible by 3, add to sum.
   ((= (remainder start 3) 0) (get-sum (+ start 1) end (+ start sum)))
   ; If start counter is divisible by 5, add to sum.
   ((= (remainder start 5) 0) (get-sum (+ start 1) end (+ start sum)))
   ; Otherwise just increment start counter.
   (get-sum (+ start 1) end sum))
)

(display (sum-of-multiples 1000))
(display " ")
我不确定我的代码目前的问题是否是因为方案语法问题,或者是我试图通过递归来解决问题。 因为这两件事我都不擅长

当我运行此代码时,只会显示“0”

如果能帮我找到并纠正错误,那就太好了


谢谢

cond
格式为:

(cond (<condition> <expr>)
       .
       .
      (else <expr>))

使用此修复程序,您的代码将显示
233168
。我没有检查你的算法,但是这个结果看起来比
0
:)

你在“所有其他情况”的情况下遗漏了
else
;应该是

(else (get-sum (+ start 1) end sum))
试图解释从何处获得0:

cond
子句的形式为
(条件表达式)
,因此您的条件是
get sum

就像
else
,这个条件从来都不是假的

在条件之后还有一个隐式的
begin
,因此您所拥有的与

(else (begin (+ start 1) end sum))
其结果是
begin
块中最后一个表达式的值,即
sum


由于当您第一次达到该条件时,
sum
为0,因此结果为0。

啊,太棒了!谢谢:D
(else (begin (+ start 1) end sum))