1.問題:計算n!
數學上的計算公式為:
n!=n(n-1)(n-2)……21
使用遞迴的方式,可以定義為:
以遞迴的方式計算4!
f(4)=4f(3) 遞迴階段
f(3)=3f(2)
f(2)=2f(1)
f(1)=1 終止條件
f(2)=(2)(1) 回歸階段
f(3)=(3)(2)
f(4)=(4)(6)
24 遞迴完成
以遞迴方式實現階乘函式的實現:
int fact(int n)
2.原理
下面來詳細分析遞迴的工作原理
先看看c語言中函式的執行方式,需要了解一些關於c程式在記憶體中的組織方式:
堆的增長方向為從低位址到高位址向上增長,而棧的增長方向剛好相反(實際情況與cpu的體系結構有關)。
當c程式中呼叫了乙個函式時,棧中會分配一塊空間來儲存與這個呼叫相關的資訊,每乙個呼叫都被當作是活躍的。棧上的那塊儲存空間稱為活躍記錄或者棧幀
棧幀由5個區域組成:輸入引數、返回值空間、計算表示式時用到的臨時儲存空間、函式呼叫時儲存的狀態資訊以及輸出引數,參見下圖:
可以使用下面的程式來檢驗:
#include
iwww.cppcns.comnt g1=0, g2=0, g3=0;
int max(int i)
int main(int argc, char **ar**)
棧是用來儲存函式呼叫資訊的絕好方案,然而棧也有一些缺點:
棧維護了每個函式呼叫的資訊直到函式返回後才釋放,這需要占用相當大的空間,尤其是在程式中使用了許多的遞迴呼叫的情況下。除此之外,因為有大量的資訊需要儲存和恢復,因此生成和銷毀活躍記錄需要消耗一定的時間。我們需要考慮採用迭代的方案。幸運的是我們可以採用一種稱為尾遞迴的特殊遞迴方式來避免前面提到的這些缺點。
3.斐波那契數列
#include
int fibonacci(int a)else }
void main()
4.遞迴將整形數字轉換為字串
#include
int tostring(int i, char str)
str[j] = c;
程式設計客棧 str[j + 1] = '\0';
return j; }
void main()
5.漢諾塔
#include
void hanoi(int i,char x,char y,char z)else }
void main()
6.四個數找最大
int max(int a, int b, int c, int d)else
}7.猴子吃桃
每天吃一半再多吃乙個,第十天想吃時候只剩乙個,問總共有多少:
int chitao(int i)else
}本文標題: c語言程式中遞迴演算法的使用例項教程
本文位址: /ruanjian/c/148186.html
C 遞迴演算法例項
static void main string args public static intprocess1 inti 第30位值 if i 0 return0 if i 1 return1 else return process1 i 1 process1 i 2 1.計算1 2 3 4 100的...
C語言的遞迴思想例項分析
通俗點來說,遞迴就是自己呼叫自己。遞迴的難點一是理解遞迴的執行呼叫過程,二是設定乙個合理的遞迴結束條件。下面來看一段摘自書中的簡單程式 include long fact int n long ct int n int main 程式設計客棧void else long fact int n ret...
C語言 遞迴演算法思想
繼上篇博文裡介紹的c語言常見基礎演算法,本篇在於演算法的思路的整理和常見的演算法程式設計實現。定義 遞迴具體用法其實就是讓你把乙個問題分解成很多個類似的情況,雖然你要解決這個問題非常難,莫名其妙,要你想幾年,但是把他一直遞迴分解,就變成很好理解的單種情況,而你整個問題又是跟這個單種情況類似,把整個問...