【SICP练习】8 练习1.12



这道练习的翻译有误。原文是:Write a procedure that computes elements of Pascal’s triangle bymeans of a recursive process.正确的翻译应该是计算帕斯卡三角形的各个元素。

y :

0       1

1      1 1

2    1 2  1

3   1 3  3  1

4 1 4  6 4  1

5

x: 0 1  2 3  4

 

如果用x代表帕斯卡三角形中列的元素的值,y则代表行的元素的值。那么(x,y)上的值等于(x-1,y-1)(x-1,y)上的元素的和。当y=0,或者x=y时,该处的值为1

综合以上的两个性质,就可以写出递归版本的pascal函数了:

(define (pascal y x)

        (cond((> x y)   (error ‘unvalid col value”))

                  ((or (= x 0) (= x y)) 1)

                  (else (+ (pascal (- y 1) (- x 1))

                            (pascal (- y 1) x)))))

下面我们来检验一下:

(pascal 5 4)

;Value: 5

(pascal 5 3)

;Value: 10

虽然题目中只要求用递归,但作为学习者,不妨也用迭代试试看。更何况在前面的学习中,我们遇到了好几次超过最大递归深度。就像书中的斐波那契一样,带有太多的重复计算。利用刚才的函数,博主测试了一下(pascal 100 49),结果毫无疑问了。

帕斯卡三角形我们在数学中也学过的吧,另外在维基百科中也有相关介绍。除了刚才的计算方法之外还有一种:

(pascal y x)=y!/(x!*(y-x)!)

传说中的什么排版东东我都不太会用,大家将就着看了。

阶乘可以用第22页的注释中的代码:

(define (factorial n)

        (define(iter product counter)

                 (if(> counter n)

                   product

                   (iter (* counter product)

                  (+ counter 1))))

        (iter1 1))

迭代版本的pascal

(define (pascal y x)

        (/  (factorial y)

            (* (factorial x)

                   (factorial (- y x)))))

迭代的好处书中有大篇幅介绍,像什么空间需求。另外计算的值的大小不受递归栈深度的控制。我们再将前文中的10049两个参数测试一下:

(pascal 100 49)

;Value: 98913082887808032681188722800

即便是用10000499两个参数也可以算出来,结果大概有110位数,这就是递归和迭代最显而易见的区别了。

下一节的习题因为太难以输入到电脑中,就先搁置了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值