因此,我对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 " ")
我不确定当前代码有问题是由于Scheme语法问题还是我尝试递归来解决问题。 因为我在这两个方面都不擅长。
运行此代码时,我只会显示“ 0”。
任何查找和纠正我的错误的帮助都很好。
谢谢!
答案 0 :(得分:4)
您在“所有其他情况”的案例中没有使用else
;应该是
(else (get-sum (+ start 1) end sum))
尝试说明您从何处获得0:
cond
子句的格式为(condition expression)
,因此您的条件是get-sum
。
就像else
一样,此条件永远不会为假。
条件之后还有一个隐式begin
,所以您拥有的等同于
(else (begin (+ start 1) end sum))
结果是begin
块中最后一个表达式的值,即sum
。
由于sum
首次达到该条件时为0,因此结果为0。
答案 1 :(得分:3)
cond
的格式为:
(cond (<condition> <expr>)
.
.
(else <expr>))
在您的代码中没有else
。 get-sum
函数(经过重新格式化)应为:
(define (get-sum start end sum)
(cond
((= start end) sum)
((= (remainder start 3) 0)
(get-sum (+ start 1) end (+ start sum)))
((= (remainder start 5) 0)
(get-sum (+ start 1) end (+ start sum)))
(else
(get-sum (+ start 1) end sum))))
使用此修复程序,您的代码将显示233168
。我没有检查您的算法,但是这个结果看起来比0
更好:)