Scheme 如何编写递归方案代码的迭代版本

Scheme 如何编写递归方案代码的迭代版本,scheme,racket,Scheme,Racket,我不知道如何改变它,使它可以迭代。参见SICP中的练习1.30。比尔在这里有一个解决办法 您可以尝试以下方法: (define (g-sum f a b) (if (= a b) (f b) (+ (f b) (g-sum f a (- b 1))))) 如果您仍然难以理解上述代码,请记住,只要我们传递所需的参数,就可以将内部助手过程提取为单独的过程。关键是,您需要一个额外的参数来用作累加器,具体如何做与此无关,我个人更喜欢使用命名的let。这相当于我前面的两个解决

我不知道如何改变它,使它可以迭代。

参见SICP中的练习1.30。比尔在这里有一个解决办法

您可以尝试以下方法:

(define (g-sum f a b)
  (if (= a b)
      (f b)
      (+ (f b) (g-sum f a (- b 1)))))
如果您仍然难以理解上述代码,请记住,只要我们传递所需的参数,就可以将内部助手过程提取为单独的过程。关键是,您需要一个额外的参数来用作累加器,具体如何做与此无关,我个人更喜欢使用命名的
let
。这相当于我前面的两个解决方案:

(define (g-sum f a b)
  (define (loop acc b)
    (if (< b a)
        acc
        (loop (+ (f b) acc) (- b 1))))
  (loop 0 b))
(定义(g-sum f a b)
(循环f a b 0))
(定义(循环f a b acc)
(如果(
如果有的话,您做了什么尝试?我不确定“让循环”和“acc”是什么means@siriacc只是一个参数。命名的
let
只是定义一个助手过程的快捷方式,该过程恰好被称为
循环
。查看我的更新。
(define (g-sum f a b)
  (define (loop acc b)
    (if (< b a)
        acc
        (loop (+ (f b) acc) (- b 1))))
  (loop 0 b))
(define (g-sum f a b)
  (loop f a b 0))

(define (loop f a b acc)
  (if (< b a)
      acc
      (loop f a (- b 1) (+ (f b) acc))))