首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP -练习1.12 -pascal三角

SICP -练习1.12 -pascal三角
EN

Code Review用户
提问于 2016-03-21 16:04:31
回答 1查看 894关注 0票数 3

来自国际预防犯罪中心:

练习1.12:下面的数字模式称为Pascal三角形。1 1 1 1 2 1 1 3 3 1 4 6 4 1 。。.三角形边的数字都是1,三角形内的每一个数都是上面两个数的之和。编写一个通过递归过程计算Pascal三角形元素的过程。

这是我的代码:

代码语言:javascript
复制
(define (pascals-triangle row col)
  ;; "The numbers at the edge of the triangle are all 1"
  (if (or (= col 0) (= col row))
      1
      (+ (pascals-triangle (- row 1)
                            (- col 1))
          (pascals-triangle (- row 1)
                            col))))

我注意到,三角形后面的边(可能)总是行数,因为我们在进入下一行时总是添加1。所以我重写了代码,只做了一点小小的改动。

代码语言:javascript
复制
(define (pascals-triangle row col)
  (cond ((or (= col 0) (= col row))
         1)
        ((or (= col 1) (= col (- row 1)))
         row)
      (else (+ (pascals-triangle (- row 1)
                                  (- col 1))
                (pascals-triangle (- row 1)
                                  col)))))

在前面的代码中,如果colum为0,则运行时间为常量。现在,在修改后的代码中,如果列为1,它也是常量。由于这是递归的,我猜我保存了几个步骤。这样的小改动对我的代码和系统会产生比这更大的影响吗?

如何改进这段代码?

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-03-21 18:05:07

您应该回溯递归调用,以使其更快。因为每个值都有一个计算兄弟(它的值来自(一个或两个)父级,其中每个父母也有另一个子值),所以您可以删除可能发生的双重计算。

此外,这些双重计算实际上会以指数方式累积,因此它不再仅仅是一种微观优化;它实际上会影响您的运行时复杂性。所以更重要的是实施回忆录。

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

https://codereview.stackexchange.com/questions/123460

复制
相关文章

相似问题

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