C語(yǔ)言深入分析遞歸函數(shù)的實(shí)現(xiàn)
一、遞歸的數(shù)學(xué)思想
遞歸是一種數(shù)學(xué)上分而自治的思想
遞歸需要有邊界條件
- 當(dāng)邊界條件不滿足時(shí),遞歸繼續(xù)進(jìn)行
- 當(dāng)邊界條件滿足時(shí),遞歸停止
遞歸將大型復(fù)雜問(wèn)題轉(zhuǎn)化為與原問(wèn)題相同但規(guī)模較小的問(wèn)題進(jìn)行處理。
二、遞歸函數(shù)
函數(shù)體內(nèi)部可以調(diào)用自己
遞歸函數(shù)
- 函數(shù)體中存在自我調(diào)用的函數(shù)
遞歸函數(shù)是遞歸的數(shù)學(xué)思想在程序設(shè)計(jì)中的應(yīng)用
- 遞歸函數(shù)必須有遞歸出口
- 函數(shù)的無(wú)限遞歸將導(dǎo)致程序棧溢出而崩潰
三、遞歸函數(shù)設(shè)計(jì)技巧
遞歸模型的一般表示法
四、遞歸函數(shù)設(shè)計(jì)示例一
用遞歸的方法編寫函數(shù)求字符串長(zhǎng)度
代碼如下:
#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; }
輸出結(jié)果如下:
五、遞歸函數(shù)設(shè)計(jì)示例二
斐波拉契數(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; }
輸出結(jié)果如下:
六、遞歸函數(shù)設(shè)計(jì)示例三
漢諾塔問(wèn)題
- 將木塊借助 B 柱由 A 柱移動(dòng)到 C 柱
- 每次只能移動(dòng)一個(gè)木塊
- 只能出現(xiàn)小木塊在大木塊之上
漢諾塔問(wèn)題分解
- 將 n-1 個(gè)木塊借助 C 柱由 A 柱移動(dòng)到 B 柱
- 將最底層的唯一木塊直接移動(dòng)到 C 柱
- 將 n-1 個(gè)木塊借助 A 柱由 B 柱移動(dòng)到 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; }
輸出結(jié)果如下:
七、小結(jié)
- 遞歸是一種將問(wèn)題分而自治的思想
- 用遞歸解決問(wèn)題首先要建立遞歸的模型
- 遞歸解法必須要有邊界條件,否則無(wú)解
到此這篇關(guān)于C語(yǔ)言深入分析遞歸函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 遞歸函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C語(yǔ)言構(gòu)建基本的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了使用C語(yǔ)言使用C語(yǔ)言構(gòu)建基本的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),包括根據(jù)前序序列和中序序列構(gòu)建二叉樹(shù)的方法,需要的朋友可以參考下2015-08-08C語(yǔ)言中“不受限制”的字符串函數(shù)總結(jié)
這篇文章主要給大家總結(jié)介紹了C語(yǔ)言中一些“不受限制”的字符串函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Qt如何利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C語(yǔ)言 結(jié)構(gòu)體(Struct)詳解及示例代碼
本文主要介紹C語(yǔ)言 結(jié)構(gòu)體的知識(shí),學(xué)習(xí)C語(yǔ)言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說(shuō)明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下2016-08-08Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問(wèn)題判斷方法
這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問(wèn)題判斷方法,請(qǐng)注意代碼中包含大量注釋,需要的朋友可以參考下2014-09-09