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)

由於網上沒具體答案...我也不知道分析對不對,如有錯誤,歡迎指正,感謝~~~

發佈了35 篇原創文章 · 獲贊 1 · 訪問量 8308
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章