2

我正在尝试编写一个将 a 和 b 之间的所有数字相加的过程。例如,如果 a=1 且 b=5,则过程将添加 1+2+3+4+5。这是我到目前为止所拥有的。我想迭代地写这个。谢谢!

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
        sum
        (iter ?? ??)))
  (iter ?? ??))
4

3 回答 3

5

对于初学者,请注意该sum过程接收四个参数,显然您必须将它们全部用作解决方案的一部分,特别是在某些时候需要这两个过程。以下是每个代表的含义:

  • term: 应用于序列的每个元素的函数
  • a: 范围的起始编号(包括)
  • next: 确定序列的下一个元素的函数
  • b: 范围的结束编号(包括)

例如,这是您使用问题中的示例测试该过程的方式:

(sum identity 1 add1 5)
=> 15

(= (sum identity 1 add1 5) (+ 1 2 3 4 5))
=> #t

但是等等,我们如何实现它?那是你自己去发现的——如果我们马上给出答案对你没有任何好处,但我可以给你一些提示:

(define (sum term a next b)
  ; internal procedure for implementing the iteration
  ; a      : current number in the iteration
  ; result : accumulated sum so far
  (define (iter a result) 
    (if (> a b)  ; if we traversed the whole range
        result   ; then return the accumulated value
        (iter    ; else advance the iteration
         ??      ; what's the next value in the range?
         (+      ; accumulate the result by adding
          ??     ; the current term in the range and
          ??)))) ; the accumulated value
  ; time to call the iteration
  (iter ??       ; start iteration. what's the initial value in the range?
        ??))     ; what's the initial value of the sum?
于 2013-09-10T13:39:13.127 回答
1

好的,所以您有两个iter调用,您必须决定将哪些值放入其中:

  • 对于外部iter调用,您必须决定aand的初始值result是什么。
    • 对于 的初始值result,请考虑如果a大于b开始时您的函数应该返回什么。
  • 对于内部iter调用,您必须决定下一个值aresult将是什么。
    • 对于 的下一个值result,您应该将当前数字添加到上一个结果中。

我希望这有帮助。

于 2013-09-10T06:09:05.450 回答
0

A lot of algorithms call for iteration, like simpson's rule for approximating integrals. We can 'fake' the iteration by calling an iterative helper .

(define (sum a b)
 (sum-iter a b 0))

(define (sum-iter index n sum)
   (if (= n index)
    (+ sum index) 
    (+  (sum-iter  n (+ index 1) (+ sum index)))
 )
于 2013-09-14T01:44:26.390 回答