所謂遞歸——函數的遞歸調用。c語言的這種特性給程序設計帶來許多方便。尤其是接觸數據結構時,會發現遞歸的出現頻率非常之高,也行之有效~下面是筆者在接觸遞歸這個東西時的一些個人總結和體會:
1.直接或間接地調用函數本身。我們在程序設計時,往往要自己寫一些函數來幫助整個解決方案的完成,有時一個函數中又要調用自身來幫助這個功能的實現。是不是被套話弄暈了?Don‘t worry~開個玩笑了。
2.一個簡單的例子可以幫助理解遞歸——求階乘。請看:
n!=n*(n-1)!(n>=1);
=1 (n=0);
這是求階乘的公式。我們顯然可以寫一個子函數來求n!(記這個函數是fac),可是注意到,求n!,我就要求(n-1)!。那么問題來了,求(n-1)! 所用到的函數不還是我們寫的這個fac函數嗎?
So,我們只要再次調用本身就ok了。下面給出子函數:
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;
}
看似好像不比循環簡潔,可是,當寫復雜一點的代碼時,遞歸的優點就顯露出來了。
3.Execu me?不斷調用,何其盡也?
可以看到,上面的程序並不是一個死循環~原因就在於這句if(n==0) f=1;這就是遞歸的終止條件。
總結:一個完整的遞歸應該有兩個必要條件:1.終止條件。2.規模漸小。
規模,又可以看做上面程序的n,他顯然是漸小的。
4.遞歸的兩個分類
1) 基於數學公式(如階乘);
2) 基於語義(難!);請看下面這個狗血的問題:
5.Hanoi塔問題。
可以概述為下面的描述:

具體代碼如下:



輸入3個時是這樣的:

需要多久呢?n個盤子需要移動2^64-1次,假設一秒一次,需要多久呢?
——————答案是約600億年!
哈哈,等你移完了,世界末日就到了~~~~可是計算機卻幫我們實現了這一功能~~真心感到計算機的強大~~~~
