sicp 第一章 递归 迭代

    sicp第一章看完了回头做上面的练习题,发现很多东西根本没有弄懂。由于这本书比较难,精力时间有限,打算暑假看完前面两章,完成习题,第三章简略看下,最后两章以后再看。

    书上内容都很精细,所以博客里也不会写太多书上的内容,如果感兴趣可以直接看书。博客里主要记录一些解题思路,和延伸的知识。

一、练习题

    Exercise 1.11 gives us a function defined by the rules that


f(n) = n if n < 3
f(n) = f(n - 1) + 2f(n - 2) + 3f(n -3) if n ≥ 3

and asks us to write both recursive and iterative procedures for the function.

要求分别写出递归计算过程和迭代计算过程。

下面代码是scheme(lisp的一种方言)写的:

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


;the function is f(n) = f(n-1) + 2f(n-2) + 3f(n-3)
;f(n) :a b c is n n-1 n-2
;f(n+1): a+2b+3c a b is n+1 n n-1
(define (f-iter a b c count)
   (if (< count 3) a
       (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1)))) 

(define (fi n)
    (f-iter 2 1 0 n))

其中f函数是递归计算过程,函数fi是迭代计算过程。迭代比递归效率高很多,但是写起来费脑力。

迭代可以参考之前斐波那切数列python版本的尾递归http://my.oschina.net/hebianxizao/blog/62328,只不过,这题里多了一个变量。

 

    还有一道题目:

Exercise 1.13 asks us to prove that Fib(n) is the closest integer to φn/√5, where

φ = (1 + √5)/2.

 Use induction and the definition of Fibonacci numbers to prove that

Fib(n) = (φ n - ψ n) / √5

想了一会儿证不出来。在 http://www.billthelizard.com/2009/12/sicp-exercise-113-fibonacci-and-golden.html找到一个很流畅清晰的证明思路。
证明极限是黄金比例分割可以这样证明:
f(n+1) = f(n) + f(n-1)
两边除以f(n)得到:
f(n+1)/f(n) = 1 + f(n-1)/f(n)
假设f(n+1)/f(n)极限存在,极限为x
x = 1+1/x
x = (1 + √5)/2


二、延伸
    换零钱方式的统计
    给了半美元,四分之一美元,10美分,5美分,1美分的硬币,将1美元换成零钱,一共多少种不同方式?
采用递归过程,就可以利用下面的关系:
总数为a的现金换成n种硬币的不同方式的数目等于
现金数a换成除第一种硬币之外的所有其他硬币的不同方式,加上
现金数a减去d换成所有种类的硬币的不同方式数目,其中d是第一种硬币的币值。
把这个描述转换成代码描述是很简单的一件事。

想起去年师兄找工作期间讨论的一道笔试题:
有一段楼梯有500级台阶,规定每一步只能跨一级或两级,要登上第500级台阶有几种不同的走法? 
这是一个比较明显的斐波那切数列问题,f(500) = f(499) + f(498),如果把规定每一步跨一级或两级改成每一步跨一级,两级,三级,解就是 f(500) =  f(499) + f(498) + f(497)

实际上这个题目跟换零钱方式是一样的,换零钱方式是一个通用的解决思路。

三、总结
    在杨辉三角,兔子繁殖问题都可以用斐波那切数列解决。
而解决这些问题的本质就是深入理解递归,迭代。



转载于:https://my.oschina.net/hebianxizao/blog/67804

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值