階乘、快速冪與斐波那契數列
今天看《計算機程式的構造和解釋》第一章,裡面提到了快速冪和斐波那契數列的快速演算法。感覺還挺巧妙的,做一點筆記。
階乘
通常我們求
,需要進行n次迭代,也就是說方法的時間複雜度為
,如果使用的是遞迴的演算法
#階乘的遞迴演算法 (define (factorial n) (if(= n 1) 1 (* n (factorial (- n 1))))
,因為在每一次迭代都需要儲存相應的值等待遞迴的數值進行計算。
如果使用的是迭代的方法
#階乘的迭代演算法 (define (factorial n) (fact-tier 1 1 n)#呼叫fact-iter方法 (define (fact-tier product counter max-count) (if(> counter max-count) product (fact-tier (* counter product) #目前的階乘值 (+ counter 1)#目前的迭代輪數 (max-counter))) #目標迭代輪數
這樣的話,迭代方法在時間複雜度依然為
的情況下,把空間複雜度降到了
也就是說只需要常數大小的空間即可完成演算法。
快速冪
。
計算x的n次冪,兩輪迭代就可以得到結果。而通常的演算法需要進行16輪計算。可以大大降低計算所需時間。
斐波那契數列的快速演算法
斐波那契數列是非常有名的一個數列,因為在兔子繁殖的例子中被使用,也有時被叫做兔子數列
簡單的描述斐波那契數列:
,因為對於每一個分支都需要獨立的進行一次計算。
顯然如果使用迭代的方法,從第一個數開始依次計算出第n個數,會大大提高演算法的效率,每個數都只需要計算一次因而時間複雜度和空間複雜度分別為.
那麼有沒有更快的方法進行斐波那契數的求解呢。
在這裡利用矩陣迭代可以加快這個速度,具體實現依據以下舉證的點乘:
複雜度的演算法。