SICP学习笔记(P27-P28)

练习1.11

        函数f如下定义: 如果n<3, 那么f(n)=n; 否则f(n)=f(n-1)+2*f(n-2)*3*f(n-3). 写出一个递归和一个迭代求这个问题.

        递归:

(define (f n)
  (if (< n 3)
      n
      (+ (f (- n 1))
         (* 2 (f(- n 2)))
         (* 3 (f(- n 3))))))

        迭代:

(define (f n)
  (if (< n 3)
      n
      (f-iter 2 1 0 n)))
(define (f-iter a b c count)
  (if ( = count 2)
      a
      (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))

练习1.12

        写一个pascal函数, 输入行和列, 求帕斯卡三角形中这个行和列的值.

        答案非常巧妙的把帕斯卡三角形放到了一个表格中. 表格中每一行的第一个数从表格的第一列开始, 那么求第row行第col列就可以非常形象描述成求第row-1行col列和row-1行和col列的和, 而这种方法最好的地方在于它表示每一行第一个数和最后一个数是1.

(define (pascal row col)
  (cond ((= row 1) 1) ;第一行值为1
        ((= row col) 1) ;行和列相同的项值为1
        ((= col 1) 1) ;第一列值都为1
        (else (+ (pascal (- row 1) col)
                 (pascal (- row 1) (- col 1))))))

练习1.13

        证明斐波那契数列第n个数Fib(n)是最接近Φn/根号5的整数,其中Φ=(1+根号5)/2.

        这题是看的答案, 证明过程也非常的直观明了.

设fi = (1+根号5)/2, psi = (1-根号5)/2

第一步目的要证明Fib(n) = (fin - psin)/根号5, 采用数学归纳法:

当n=0时, Fib(0) = (fi0 - psi0)/根号5 = 0, 成立

当n=1时, Fib(1) = (fi1 – psi1)/根号5 = 1, 成立

推广到n时, Fib(n) = Fib(n-1) + Fib(n-2) = (fin-1 – psin-1 + fin-2 – psin-2)/根号5

                        = ((fi + 1)fin-2 – (psi +1)psin-2)/根号5    , 式1

               因为fi2 = fi + 1, psi2 = psi + 1

               所以式1= (fin - psin)/根号5, 即可证明第一步的式子.

当n趋向于无穷大的时候, 因为psi=-0.618, 所以psin趋向于0, 即可得证Fib(n)是最接近Φn/根号5的整数.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值