首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写递归方案代码的迭代版本

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

Stack Overflow用户
提问于 2016-10-02 14:44:45
回答 2查看 579关注 0票数 2
代码语言:javascript
复制
(define (g-sum f a b)
  (if (= a b)
      (f b)
      (+ (f b) (g-sum f a (- b 1)))))

我不知道如何改变这一点,这样它才能迭代。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-02 15:01:02

你可以试试这个:

代码语言:javascript
复制
(define (g-sum f a b)
  (let loop ((acc 0) (b b))
    (if (< b a)
        acc
        (loop (+ (f b) acc) (- b 1)))))

将递归过程转换为迭代过程的诀窍是传递一个参数,该参数累加结果,并在递归结束时返回它,确保递归调用是我们在递归步骤中做的最后一件事,不需要等待计算。

为了简单起见,我使用了一个名为let的程序,但这并不是必需的,因为使用助手内部过程会产生同样的效果。上述代码相当于:

代码语言:javascript
复制
(define (g-sum f a b)
  (define (loop acc b)
    (if (< b a)
        acc
        (loop (+ (f b) acc) (- b 1))))
  (loop 0 b))

如果您仍然难以掌握上面的代码,请记住,只要我们传递所需的参数,就可以将内部助手过程提取为单独的过程。重点是,您需要一个额外的参数作为累加器使用,您究竟是如何做到这一点是无关紧要的,就我个人而言,我更喜欢使用一个命名的let。这相当于我之前的两种解决方案:

代码语言:javascript
复制
(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))))
票数 0
EN

Stack Overflow用户

发布于 2016-10-02 15:00:42

见SICP中的练习1.30。比尔有个解决办法。

http://www.billthelizard.com/2010/04/sicp-exercise-130-iterative-sums.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39818144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档