【C/C++】递归算法
所謂遞歸——函數(shù)的遞歸調(diào)用。c語言的這種特性給程序設(shè)計(jì)帶來許多方便。尤其是接觸數(shù)據(jù)結(jié)構(gòu)時(shí),會(huì)發(fā)現(xiàn)遞歸的出現(xiàn)頻率非常之高,也行之有效~下面是筆者在接觸遞歸這個(gè)東西時(shí)的一些個(gè)人總結(jié)和體會(huì):
1.直接或間接地調(diào)用函數(shù)本身。我們?cè)诔绦蛟O(shè)計(jì)時(shí),往往要自己寫一些函數(shù)來幫助整個(gè)解決方案的完成,有時(shí)一個(gè)函數(shù)中又要調(diào)用自身來幫助這個(gè)功能的實(shí)現(xiàn)。是不是被套話弄暈了?Don‘t worry~開個(gè)玩笑了。
2.一個(gè)簡單的例子可以幫助理解遞歸——求階乘。請(qǐng)看:
n!=n*(n-1)!(n>=1);
=1 ? ? ? ? ? ? ? ? (n=0);
這是求階乘的公式。我們顯然可以寫一個(gè)子函數(shù)來求n!(記這個(gè)函數(shù)是fac),可是注意到,求n!,我就要求(n-1)!。那么問題來了,求(n-1)! 所用到的函數(shù)不還是我們寫的這個(gè)fac函數(shù)嗎?
So,我們只要再次調(diào)用本身就ok了。下面給出子函數(shù):
int fac(int n)
{
int f;
if(n<o) printf("error!");
else if(n==0) f=1;
else f=n*fac(n-1);
return f;
}
看似好像不比循環(huán)簡潔,可是,當(dāng)寫復(fù)雜一點(diǎn)的代碼時(shí),遞歸的優(yōu)點(diǎn)就顯露出來了。
3.Execu me?不斷調(diào)用,何其盡也?
可以看到,上面的程序并不是一個(gè)死循環(huán)~原因就在于這句if(n==0) f=1;這就是遞歸的終止條件。
總結(jié):一個(gè)完整的遞歸應(yīng)該有兩個(gè)必要條件:1.終止條件。2.規(guī)模漸小。
規(guī)模,又可以看做上面程序的n,他顯然是漸小的。
4.遞歸的兩個(gè)分類
1) 基于數(shù)學(xué)公式(如階乘);
2) 基于語義(難!);請(qǐng)看下面這個(gè)狗血的問題:
5.Hanoi塔問題。
可以概述為下面的描述:
具體代碼如下:
輸入3個(gè)時(shí)是這樣的:
?
?
?需要多久呢?n個(gè)盤子需要移動(dòng)2^64-1次,假設(shè)一秒一次,需要多久呢?
?
?
——————答案是約600億年!
?
哈哈,等你移完了,世界末日就到了~~~~可是計(jì)算機(jī)卻幫我們實(shí)現(xiàn)了這一功能~~真心感到計(jì)算機(jī)的強(qiáng)大~~~~
?
轉(zhuǎn)載于:https://www.cnblogs.com/duye/p/6075712.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的【C/C++】递归算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个很详细的web.xml讲解(转)
- 下一篇: C++头文件保护符和变量的声明定义