為什麼說遞迴效率低?

時間 2021-05-12 00:38:46

1樓:CuKing

遞迴效率不低

低的是因為濫用,或者是為了省事不在意速度.

比如求階乘,乙個迴圈輕鬆解決,但是你非要遞迴那可不是浪費很多開銷麼.

但是你要是多分支的遞迴,迴圈搞就得手工棧模擬,想實現的比原生遞迴更好更快還是有難度的,這時候直接遞迴反而效率高

2樓:stary

1 函式開銷

2 不會寫遞迴比如fib沒有memorization3 在不需要遞迴的地方寫遞迴

遞迴只是一種寫法一種工具

單純問它為什麼效率低是非常奇怪的

這個問題就類似於:"錘子為什麼不好用?"

可能你用它來擦玻璃了

3樓:王皮鞋

1、遞迴的效率低在某些意義上是編譯器造成的,和遞迴的思想無關。(在Lisp家族裡充斥著遞迴的影子,無論是從文法定義上還是編譯器的角度考慮,可以說遞迴是非常優雅的)

To iterate is human, to recursive,divine.

2、迭代。(通過消除函式呼叫造成的push、pop開銷)

4樓:

遞迴效率低是相對於迭代來說的,因為遞迴不是圖靈機的原生程式結構,迭代基本可以算是。(迭代是遞迴在有限狀態機裡面的等價形式)第二個問題就是遞迴層次多的話,可能會爆棧,雖然有些遞迴演算法可以寫成尾呼叫的形式避免爆棧。

5樓:Thomas Lau

很多人的誤區,當我們說遞迴效率低的時候,潛在的思維是,是將用計算機遞迴呼叫方法的實現,和遞迴優化後的程式(最簡單如尾遞迴優化)作比較的。

所以要搞清楚這裡的比較物件。

遞迴是一種思維方法,慢的是遞迴的各種實現。至於程式或編譯器或系統對遞迴優化,相信這裡會有更好的回答。

6樓:Aecced

因為遞迴相比於普通迴圈來說,多了函式呼叫開銷。

遞迴發生函式呼叫時,返回位址和正在呼叫的函式的所有區域性變數的值以及形式引數的值會被儲存到環境棧中。這個過程涉及的壓棧出棧操作都是花費時間的,完成同一件事情,增大了時間開銷,那麼其效率自然會降低。

7樓:

排除演算法設計本身的因素,遞迴帶來的效率問題主要是函式呼叫帶來的額外開銷(函式的入棧出棧),以及棧容量的限制(次數太多可能會stack overflow)

8樓:哈哈

對效能部分不是很了解,我也是遞迴構造了tree結構,寫個介面給前台用,,一般都是做許可權選單用的東西,選單不會超過多少的,300個選單,最深的是三層,測試了一下,花費了438ms,用的fastjson,還給選單排序了,我感覺花費時間還算可以吧。

9樓:toto

首先,為什麼出現遞迴這麼個思想,是因為計算機執行速度實在是太快了

其次,遞迴效率低,是因為,遞迴往往做了很多次重複技術,比如樓上那位同學說的斐波那契數列

最後,良好的設計可以提公升效率,比如斐波那契問題,剔除重複計算的部分,效率其實並不算低

10樓:

遞迴很多時候效率低是因為演算法設計得不合理,每次遞迴呼叫有重複計算的資料存在。並且現代編譯器很多時候會做內聯優化,編譯完了之後就是乙個函式。

11樓:Milo Yip

之前做 RapidJSON 時,直譯器用遞迴下降方式,由於沒有限定層數,有機會做極深的 JSON 請求來引發 stack overflow(如 ൪ 一百萬層),產生安全性及穩定性問題。

之後同事再寫多了乙個版本,就是自行實現 stack (所謂的用迭代取代遞迴),只要有足夠的 heap 就不會有問題。當然,在這個個例上,也可以簡單地限制層數來解決。

遞迴的額外耗時決於函式呼叫的成本,這成本與具體平台相關。

許多時候,可以尾呼叫的遞迴還不如顯式寫作迭代。不可以尾呼叫的遞迴,要換作迭代方式就需要自建 stack,較為複雜,但有可能降低時間和空間的係數,並且能支援更大的深度。

12樓:

有的程式語言的遞迴會重複運算引數值相同返回值相同的函式,不過用空間換時間,可以把引數值相同的返回結果先存起來,但這又增加了點程式的複雜性。

尾遞迴沒有這個問題,尾遞迴的思路和迴圈基本一樣,在有的語言會把尾遞迴轉換成迴圈。

應該是怎麼方便怎麼寫,遞迴寫得正確最多比迴圈慢一倍(重複運算就是指數級的了),又不是指數級別的差距,多數情況下不用關心。

13樓:Cai Yu

遞迴的除錯難度奇高,就決定了實際專案中很少用遞迴。

而且遞迴確實執行效率低,因為函式一層一層呼叫存在呼叫棧,在切換到更深層的函式時要產生斷點,為了保證回來時繼續執行,必須儲存現在所處函式的各種狀態,回來時恢復狀態,這樣一層層下去效能損失就不斷增加。

為什麼38說電機是低負載高轉速效率更高,真的是這樣嗎?

電機效率最高的一段應該是中轉速中高扭矩。電機需要變速箱,沒有變速箱的電動汽車效能大打折扣,比如前途K50。電動車高速續航捉雞這個問題跟效率也有一定關係,增加高速檔位之後可以小幅提高續航里程。電動機有異於內燃機的功率輸出曲線,可以不使用多檔變速箱,但是電機的最大功率輸出也是有一定範圍的,加上變速箱之後...

為什麼說二叉樹遍歷用遞迴的方法不如非遞迴方法

薛瑄 雖然從時間複雜度來看,二叉樹遍歷遞迴和迭代都是O logn 但是這裡的常係數相差甚大。也就是說遞迴 O a Logn 迭代是O b Logn 這裡的a b 用鄧教授更通俗的說法是,1秒和1年都是O 1 但是他們的常係數相差甚遠。B樹和平衡二叉搜尋樹,查詢時間複雜度是O logn 但是常係數相差...

為什麼Python效率這麼低,還這麼火?

遊戲中年 python火是因為上手簡單,但很明顯的是在處理大量的資料時cpp的執行效率有更大的優勢,有些工作cpp一天可完成,換成python那就是十天,屬於不可接受的。 吉祥鳥 不能以乙個方面來定義一門語言,這就和藝人一樣,別人雖然演技差,但是長得好看,做不了實力派,別人能做偶像派,難道偶像派就沒...