方案中的倍数总和

时间:2018-08-15 00:32:19

标签: 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)
   (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”。

任何查找和纠正我的错误的帮助都很好。

谢谢!

2 个答案:

答案 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>))

在您的代码中没有elseget-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更好:)