一個(gè)函數(shù)調(diào)用其本身,此調(diào)用過程為遞歸(recursion)。
舉個(gè)栗子:
/*用來測試UpAndDown函數(shù)的驅(qū)動程序*/#include <stdio.h>void UpAndDown (int);int main(void){ UpAndDown(1); return 0;}void UpAndDown (int n){ 輸出如下:
每級遞歸都使用其私有變量(如例子中的n)
每次函數(shù)調(diào)用都返回前一級(調(diào)用他那級)遞歸
遞歸函數(shù)中,位于遞歸調(diào)用前的語句和各級被調(diào)函數(shù)具有相同執(zhí)行順序
遞歸函數(shù)中,位于遞歸調(diào)用后的語句和各級被調(diào)函數(shù)具有相反執(zhí)行順序
每級遞歸會從頭執(zhí)行而不是復(fù)制其函數(shù)代碼,所以一般可代替循環(huán)語句。
遞歸函數(shù)必須包含可以終止遞歸調(diào)用的語句(如if)。
最簡單的遞歸形式。
把遞歸調(diào)用語句放在函數(shù)結(jié)尾(return語句之前)。
舉個(gè)栗子: 計(jì)算n的階乘
long fact (int n) // 使用循環(huán)計(jì)算階乘,占內(nèi)存少,執(zhí)行快{ long ans; for(ans = 1; n>1; n--) ans *= n; return ans;}long rfact (int n) // 使用遞歸計(jì)算階乘,僅作尾遞歸展示、入門{ long ans; if(n > 0) ans = n * rfact(n-1); else ans = 1; //1.零的階乘;2.結(jié)束遞歸。 return ans;}將一個(gè)整數(shù)轉(zhuǎn)換成二進(jìn)制形式。
void ToBinary (unsigned long n) // 簡單須存數(shù)組版遞歸{ int r; r = n % 2; if(n >= 2) ToBinary(n / 2); putchar('0' + r); //or: putchar(r ? '1' : '0') return;}舉個(gè)栗子:斐波那契數(shù)列:第一、二個(gè)數(shù)字都是1,而后續(xù)的每個(gè)數(shù)字是其前兩個(gè)數(shù)字之和。1、1、2、3、5、8、13……
long Fibonacci (int n){ if(n > 2) return Fibonacci(n-1) + Fibonacci(n-2); else return 1;}雙重遞歸。 致命弱點(diǎn):每級調(diào)用變量數(shù)以指數(shù)遞增!
main( )也可以被自身遞歸調(diào)用或其他函數(shù)調(diào)用,盡管用得少。
新聞熱點(diǎn)
疑難解答
圖片精選