① 遞歸和非遞歸(用棧)哪個效率更高
以下是比較全面的解釋,可以看看。 遞歸演算法是一種直接或者間接地調用自身的演算法。在計算機編寫程序中,遞歸演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。 遞歸演算法解決問題的特點: (1) 遞歸就是在過程或函數里調用自身。 (2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。 (3) 遞歸演算法解題通常顯得很簡潔,但遞歸演算法解題的運行效率較低。所以一般不提倡用遞歸演算法設計程序。 (4) 在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸演算法設計程序。
② 程序的遞歸演算法與非遞歸的區別
1、遞歸和非遞歸(用棧) 非遞歸(用棧),也用到棧函數了,和遞歸就沒多大區別了! 每次遞歸進棧出棧,非遞歸(用棧)的每次調用棧函數也是進棧出棧。主要是在非遞歸(用棧)中,它的棧函數里比遞歸多了些賦值語句。。。所以效率上,非遞歸(用棧)比遞歸差。 只不過,遞歸越深,佔用棧空間越多。非遞歸(用棧),佔用的棧空間少。如果,遞歸的深度還沒達到超出棧空間的程度,那麼遞歸比非遞歸(用棧)好。 如果是非遞歸(不用棧),當然是非遞歸最好。 在下面的這個例子(解決「整數劃分問題」)中,說明了如果只是用棧機械的模擬,得到的結果只是: 空間不變(事實上,非遞歸應該多一些),而非遞歸的時間數倍的增加。。 感興趣的朋友運行就知道了 #include<iostream> #include<stack> #include<ctime> using namespace std; //---------------------------遞歸演算法 int q(int n,int m) { if((n<1) || (m<0)) return 0; if((n==1) ||(m==1)) return 1; if(n<m) return q(n,n); if(n==m) return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); } int q(int num) { return q(num,num); } struct Point { int n,m; Point(int _n,int _m){ n=_n; m=_m;} }; //-------------------------非遞歸演算法 int _q(int n,int m) { int sum=0; Point tmp(n,m); stack<Point> s; s.push (tmp); while(!s.empty()) { tmp=s.top(); n=tmp.n; m=tmp.m; s.pop(); if((n<1) || (m<0)) ++sum; else if((n==1) ||(m==1)) ++sum; else if(n<m) s.push(Point(n,n)); else if(n==m) { ++sum; s.push(Point(n,m-1)); } else { s.push(Point(n,m-1)); s.push(Point(n-m,m)); } } return sum; } int _q(int num) { return _q(num,num); } int main() { int num; unsigned int p; do{ cout<<"Input a num:"; cin>>num; p=clock(); cout<<" 遞歸: "<<q(num)<<endl; cout<<"\t\t用時:"<<clock()-p<<endl; p=clock(); cout<<"非遞歸: "<<_q(num)<<endl; cout<<"\t\t用時:"<<clock()-p<<endl<<endl; }while(num); return 0; } 2. 如果非遞歸不是用棧做的 這里有一個網友做的漢諾塔問題的非遞歸解法 看了真讓人汗顏 這樣的規律都有人發現 下載地址是: http://wenku..com/view/cfd56b3610661ed9ad51f3f9.html 此演算法不是用大家以前熟悉的遞歸演算法 雖然沒運行 可以猜想 這個程序的空間和時間效率毫無疑問會大幅度提高。 3. 總結: 直接引用《演算法設計與分析(第二版)》里的一段話: 結構清晰,可讀性強,而且容易用數學歸納法來證明演算法的正確性,而且它為設計演算法,調試程序帶來很大方便。 然而遞歸演算法的運行效率較低,無論是耗費的計算時間還是佔用的存儲空間都比非遞歸演算法要多 僅僅是機械地模擬還不能達到減少計算時間和存儲空間的目的。因此,還需要根據具體程序和特點對遞歸調用的工作棧進行簡化,盡量減少棧的操作,壓縮棧存儲以達到節省計算時間和存儲空間的目的。
③ 所有用遞歸演算法的能不能都用非遞歸演算法實現
用遞歸演算法可以使程序結構清晰,可讀性好,但是它的運行效率很低,而且會占據很大存儲空間,因此有時希望在程序中消除遞歸.因為在計算機內遞歸演算法實際上是用一個工作棧來實現的,所以所有的遞歸演算法理論上來說是可以用非遞歸演算法實現,我們可以用一個棧來模擬遞歸演算法
④ 二叉樹的非遞歸遍歷有什麼優點
遞歸和非遞歸只是解決問題的方法的不同,本質還是一樣的。
2. 遞歸演算法相對於非遞歸演算法來說效率通常都會更低
2.1 遞歸演算法會有更多的資源需要壓棧和出棧操作(不僅僅是參數,還有函數地址等)
2.2 由於編譯器對附加的一些棧保護機制會導致遞歸執行的更加低效
3. 使用循環代替遞歸演算法,通常可以獲得更好的執行效率和空間效率,在二叉樹層次較深的情況下,採用非遞歸方式遍歷能夠有效的提升遍歷的性能。
⑤ 遞歸與非遞歸的比較(從代碼量、執行效率兩個角度)作答
遞歸的代碼量比非遞歸的代碼量少,因為非遞歸需要額外的變數記錄當前所處的位置信息,以及額外的控制語句。而遞歸所使用的方式是函數調用,這是非常自然的棧結構,不需要記錄位置信息,不需要添加控制語句,這些工作都由函數調用的特性解決了。遞歸的執行效率比非遞歸的執行效率低,因為遞歸的實質是函數調用,而函數調用必然要進行線程棧空間的分配,記錄每一次函數調用前的狀態等工作,開銷是比較大的。而非遞歸則不需要進行這些工作。
⑥ 非遞歸演算法比較有哪些主要的優點和缺點
非遞歸演算法和遞歸演算法的主要優缺點:
非遞歸演算法的優點:如果需要處理的數據規模比較大的時候,適合使用非遞歸演算法。缺點:程序代碼的可讀性差一些。
遞歸演算法的優點:程序代碼的可讀性要比非遞歸演算法的好,如果需要處理的數據量比較小的時候,適合使用遞歸演算法。缺點:當需要處理的數據規模比較大的時候,就不適合使用遞歸演算法了。因為遞歸演算法涉及到對堆棧的頻繁操作(入棧、出棧),系統效率會很低,嚴重的時候會導致系統崩潰。
⑦ 遞歸演算法執行效率比功能相同的非遞歸演算法的執行效率高。是否正確
錯。
遞歸寫起來簡單,但是效率比較低。
⑧ 遞歸演算法跟非遞歸演算法的區別
遞歸演算法是一種分而治之的方法,簡單的說就是調用自己本身;能把復雜的問題化為簡單來解決;但是執行的效率比較低,所以一般分析問題用遞歸,實際解決問題用非遞歸。
⑨ 遞歸演算法與非遞歸演算法的比較
否,一般而言非遞歸演算法更有效;但很多時候遞歸演算法容易實現,編程簡單。
⑩ C語言的兩個問題: 所有的遞歸程序均可以用非遞歸演算法實現遞歸函數中的形式參數是自動變數嗎 c語言中
C語言所有遞歸都可以用非遞歸演算法實現,最典型的就是迭代法,有時比遞歸更容易理解。至於遞歸中的形式參數是自動變數,沒明白樓主的意思,形參就是形參啊,形參變數也是變數,其內存分配在棧區,隨著函數的結束,其內存也會被釋放,形參的生命周期與函數生命周期相同哈(同生共死)