高中读完我就把数学都忘光了,看SICP的习题1.19硬是看不明白,网上找了好久,有幸看到一篇文章说得很详细,下面是我看完此文章后的个人理解。
斐波那契的定义
题目
题目给出以下代码要我们补全:
(define (fib n)
(fib-iter 1 0 0 1 n))
(define (fib-iter a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-iter a
b
<??> ; compute p'
<??> ; compute q'
(/ count 2)))
(else (fib-iter (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))
先理解普通算法
最原始的解法,从和开始,运算n次才能算出和:
翻译翻译"T"到底代表什么
题目给出了一个很巧妙的算法,可以降低时间复杂度到。由于我的数学水平差,所以这里先不考虑算法的原理是什么,只考虑:这个算法是怎么运作的。 对于任意一个斐波那契对,我们假设左边较大的是,右边较小的是。例如假设。那么对于下一对新的序列和:
我们把这种将转化为的转化方式记为。那么对于原始的计算斐波那契的方式,等价于执行n次——即。
引入p和q
题目这里开始不说人话了,无缘无故引入了两个变量和,并且给出了一个新的转化方式,我们称为:
然后题目说,假设这里的,那么这个表达式和上面的表达式是等价的,这不是屁话吗?!
最难理解的地方来了。题目又说:有一种方式可以由和计算出和,新的和的作用是一次性执行两次,即,至于为什么,我也不知道。
例如我们要计算,原始解法是,过程如下:(第四步应该为,第五步应该为,第六步应该为...等等等,写太长会很难看,所以省略)
而它这个解法,过程如下:
注意这里的过程,的值和一样是迭代计算的,如果指数是奇数——则不变,如果指数是偶数——则算出新的作为下一步迭代。
如何计算p'和q'
注意:只有指数是偶数的情况下,才需要计算 已知,我们把表达式左边计算出来,就可以得到了。先通过把计算出来:
同样可以通过计算为:
用观察法,可以把上面复杂的改写为:
对比和的右边可知:
算法的原理
To be determined