SICP ex1-15

题目背景:利用辗转相除法计算最大公因数

要求利用normal-order evaluation展开gcd 并计算O(假设时间界与reminder成比例)

首先我们利用例子(gcd 206 40)进行探索

(gcd 206 40)

if 判断40非0 展开

(gcd 40 (reminder 206 40))

if 判断(reminder 206 40)) 非0

继续展开

(gcd (reminder 206 40) (reminder 40 (reminder 206 40)))

......

我们经过较多次的尝试之后进行归纳分别记第n次展开式中第一参数,第二参数为xn,yn

x0=0,y0=0

x1=0,y1=1

x2=1,y2=2

x3=2,y3=4

x4=4,y4=7

x5=7,y5=12

......

好像有点规律,我们再看展开式,进行简单分析,发现

x0=0,y0=1,xn=y(n-1),yn=x(n-1)+y(n-1)+1

接下来,我们计算假设需要k次运算,我们总共需要

判断if时进行reminder计算:y0+y1+...+y(k-1)

以及展开式的reminder计算:xk+yk

我们把两个相加:y0+y1+...yk+xk=y0+...y(n-1)+yn+y(n-1)

现在我们目的很明确,通过三项的数列递推式求取yn通项公式,利用特征方程,x^2-x-1=0,

得出yn=(15-3*5^(1/2))/10*a^(n-1)+(3*5^(1/2)-5)/10*b^(n-1)    (a=(1-5^(1/2))/2  b=(1+5^(1/2))/2)

通过粗略估算时间界为O(k*b^k)

又因为k为logn 所以O(nlogn)

由于网上没具体答案...我也不知道分析对不对,如有错误,欢迎指正,感谢~~~

你可能感兴趣的:(SICP ex1-15)