练习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的整数.