【C語言】遞迴演算法的學習
阿新 • • 發佈:2018-11-06
一、初識遞迴
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。
一般來說,遞迴需要滿足三要素:
- 邊界條件;
- 遞迴前進段;(規模縮小)
- 遞迴返回段。
當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
二、遞迴深度學習
1、通過例項1:求解n!來學習遞迴演算法的實現
例項1:求解n!(遞迴實現)
#include <stdio.h>
int fac(int n)
{
if(n==0||n==1)
{
return 1;
}
else
{
return n*fac(n-1);
}
}
int main()
{
int t;
t=fac(5);
printf("%d\n",t);
}
執行結果:
我們通過遞迴已經成功實現求n!,那它的過程是怎樣的呢?接下來通過圖1來向大家展示
雖然遞迴能夠實現5!,但是遞迴也有一定的侷限性。由於棧是由系統自行管理,windows分配的記憶體大小是1M
求解n!(for迴圈實現)
#include <stdio.h>
int fac2(int n)
{
int res=1;
int i;
if(n==0)
{
res=1;
}
else
{
for(i=1;i<=n;i++)
{
res*=i;
}
}
return res;
}
int main()
{
int t;
t=fac2(5);
printf("%d\n",t);
return 0;
}
執行結果:
三、遞迴和迴圈的優缺點比較
1、遞迴
優點:程式碼簡潔、清晰,並且容易驗證正確性。
缺點:
- 它的執行需要較多次數的函式呼叫,每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數、返回地址以及臨時變數,如果呼叫層數比較深,需要增加額外的堆疊處理(還有可能出現堆疊溢位的情況)
- 往棧中壓入資料和彈出資料都需要時間,如果呼叫層數比較深,會造成時間消耗,效率降低。
2、迴圈
優點:速度快(效率高),結構簡單,沒什麼額外開銷。
缺點:不容易理解,編寫複雜問題時困難