遞迴和迭代的區別

2021-07-13 08:12:17 字數 1187 閱讀 9187

c++程式中允許函式遞迴呼叫,在呼叫乙個函式的過程中如果出現直接或間接呼叫該函式本身,則稱為函式的遞迴呼叫,這樣的函式稱為遞迴函式,例如:

int fun1()

···                //函式其它部分

z=fun1();     //直接呼叫自身

···                //函式其它部分

在fun1()函式中又呼叫了fun1()函式,這種呼叫稱為直接呼叫,又如:

int fun2()

x=fun3();

int fun3()

y=fun2();

函式fun2()呼叫了fun3(),fun3()中又呼叫了fun2(),這種呼叫稱為間接遞迴呼叫。

可以看到,遞迴是一種特殊的巢狀呼叫,但是遞迴呼叫必須要是有限次的,在使用遞迴時,必須有乙個明確的結束條件,該條件稱為遞迴出口,否則會進入死迴圈,常用的辦法是使用條件判斷,如if、while、do while等。

遞迴分為兩個階段:

(1)遞推:將原問題不斷分解為新的子問題,逐漸從未知向已知遞推,最終達到已知的條件,即遞迴結束的條件,這時遞推階段結束;

(2)回歸:從已知條件出發,按照遞推的逆過程,逐一求值回歸,最後到達遞迴的開始處,結束回歸階段,完成遞迴呼叫。

#include

int main(void)

int fib(int n);

int n,i;

scanf("%d",&n);

printf("%d",fib(n));

}int fib(int n)

if(0 == n)

return 0;

if(1 == n)

return 1;

if(n > 1)

return fib(n-1)+fib(n-2);

上面是乙個求斐波那契數列的遞迴呼叫例子,它引起一系列的函式呼叫,並有可能會有一系列的重複計算,因此遞迴演算法的執行效率相對較低。

迭代:利用變數的原值推算出變數的乙個新值,如果遞迴是自己呼叫自己的話,迭代就是a不停的呼叫b。

遞迴中一定存在迭代,但是迭代中不一定存在遞迴,大部分可以相互轉換,如果能用迭代盡量別用遞迴,遞迴浪費空間效率很低,並且遞迴計算量太大的話容易造成堆疊的溢位。

int funca(int n)        //這是遞迴

int funcb(int n)        //這是迭代

遞迴和迭代區別

遞迴和迭代 遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做位址儲存,引數傳遞等,這是通過乙個遞迴工作棧實現的。具體是每次呼叫函式本身時需要儲存的內容有區域性變數 形參 函式位址等,那麼,如果遞迴呼叫n次,則遞迴棧裡需要儲存n 區域性變數,n 形參,n 函式位址個記憶體空間,很可能導致空...

遞迴和迭代的區別

遞迴的基本概念 程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己.乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少 量.遞迴的能力在於用有限的語句來定義物件的無限集合.使用遞迴要注意的有兩點 1 遞迴就是在...

遞迴和迭代的區別

遞迴的基本概念 程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己.乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少 量.遞迴的能力在於用有限的語句來定義物件的無限集合.使用遞迴要注意的有兩點 1 遞迴就是在...