Scheme 如何编写递归方案代码的迭代版本
我不知道如何改变它,使它可以迭代。参见SICP中的练习1.30。比尔在这里有一个解决办法 您可以尝试以下方法: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。这相当于我前面的两个解决
(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))))