C語言深入分析遞歸函數(shù)的實現(xiàn)
一、遞歸的數(shù)學思想
遞歸是一種數(shù)學上分而自治的思想
遞歸需要有邊界條件
- 當邊界條件不滿足時,遞歸繼續(xù)進行
- 當邊界條件滿足時,遞歸停止
遞歸將大型復雜問題轉化為與原問題相同但規(guī)模較小的問題進行處理。
二、遞歸函數(shù)
函數(shù)體內部可以調用自己
遞歸函數(shù)
- 函數(shù)體中存在自我調用的函數(shù)
遞歸函數(shù)是遞歸的數(shù)學思想在程序設計中的應用
- 遞歸函數(shù)必須有遞歸出口
- 函數(shù)的無限遞歸將導致程序棧溢出而崩潰
三、遞歸函數(shù)設計技巧
遞歸模型的一般表示法

四、遞歸函數(shù)設計示例一
用遞歸的方法編寫函數(shù)求字符串長度

代碼如下:
#include <stdio.h>
int strlen_r(const char* s)
{
if( *s )
{
return 1 + strlen_r(s+1);
}
else
{
return 0;
}
}
int main()
{
printf("%d\n", strlen_r("abc"));
printf("%d\n", strlen_r(""));
return 0;
}輸出結果如下:

五、遞歸函數(shù)設計示例二
斐波拉契數(shù)列遞歸解法
1,1,2,3,5,8,13,21,...

代碼如下:
#include <stdio.h>
int fac(int n)
{
if( n == 1 )
{
return 1;
}
else if( n == 2 )
{
return 1;
}
else
{
return fac(n-1) + fac(n-2);
}
return -1;
}
int main()
{
printf("%d\n", fac(1));
printf("%d\n", fac(2));
printf("%d\n", fac(9));
return 0;
}輸出結果如下:

六、遞歸函數(shù)設計示例三
漢諾塔問題
- 將木塊借助 B 柱由 A 柱移動到 C 柱
- 每次只能移動一個木塊
- 只能出現(xiàn)小木塊在大木塊之上

漢諾塔問題分解
- 將 n-1 個木塊借助 C 柱由 A 柱移動到 B 柱
- 將最底層的唯一木塊直接移動到 C 柱
- 將 n-1 個木塊借助 A 柱由 B 柱移動到 C 柱

代碼如下:
#include <stdio.h>
void han_move(int n, char a, char b, char c)
{
if( n == 1 )
{
printf("%c --> %c\n", a, c);
}
else
{
han_move(n-1, a, c, b);
han_move(1, a, b, c);
han_move(n-1, b, a, c);
}
}
int main()
{
han_move(3, 'A', 'B', 'C');
return 0;
}輸出結果如下:

七、小結
- 遞歸是一種將問題分而自治的思想
- 用遞歸解決問題首先要建立遞歸的模型
- 遞歸解法必須要有邊界條件,否則無解
到此這篇關于C語言深入分析遞歸函數(shù)的實現(xiàn)的文章就介紹到這了,更多相關C語言 遞歸函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Qt利用QNetwork實現(xiàn)上傳數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細介紹了Qt如何利用QNetwork實現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-02-02
Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問題判斷方法
這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問題判斷方法,請注意代碼中包含大量注釋,需要的朋友可以參考下2014-09-09

