一直以為遞迴比較方便,也知道遞迴相對於堆疊實現會有一些效能方面的問題,一直沒引起重視,但今天測試了乙個例項,結果真的很嚇人,看來以後在這方面一定要多多注意了。
問題的提出,題目:已知數列:1,1,2,3,5,8,13,21,34,..... 求第50個數值? 並用c#寫出演算法?
一看就知道是菲波那契數列,用簡單的遞迴就可以實現。實現**如下:
private long fib(int num)
else
}結果就測試了一下fib(50)的值為12586269025 ,用的時間是total milliseconds:405906.25,哇,人都等老了!
接著想用堆疊實現不用那麼多次回溯,應該會快一點,於是就寫了一下(實際上,根本不需要用到堆疊,只需要用一些中間變數儲存中間結果即可)
private long fib(int num)
else
return s;}}
結果用了0s。
遞迴可能出現的效能問題
遞迴演算法的 很簡潔。但同時也存在缺點。遞迴由於函式要呼叫自身,而函式呼叫是有時間和空間的消耗的。每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數 返回位址及臨時變數,而且往棧裡壓入資料和彈出資料都需要時間。遞迴有可能很多計算都是重複的,從而對效能帶來很大的負面影響。遞迴的本質是把乙個問題分解成...
mysql 遞迴 效能 漫談遞迴 遞迴的效率問題
遞迴在解決某些問題的時候使得我們思考的方式得以簡化,也更加精煉,容易閱讀。那麼既然遞迴有這麼多的優點,我們是不是什麼問題都要用遞迴來解決呢?難道遞迴就沒有缺點嗎?今天我們就來討論一下遞迴的不足之處。談到遞迴就不得不面對它的效率問題。為什麼遞迴是低效的 還是拿斐波那契 fibonacci 數列來做例子...
關於遞迴 return none的問題
str1 raw input enter a string print len str1 defremovespace str1 str2 if str1 0 and str1 1 return str1 elif str1 0 if str1 1 str2 str1 1 1 return remo...