程序調用自身的編程技巧稱爲遞歸( recursion)。算法
遞歸作爲一種算法在程序設計語言中普遍應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它一般把一個大型複雜的問題層層轉化爲一個與原問題類似的規模較小的問題來求解,遞歸策略只需少許的程序就可描述出解題過程所須要的屢次重複計算,大大地減小了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。通常來講,遞歸須要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不知足時,遞歸前進;當邊界條件知足時,遞歸返回。編程
注意:
遞歸就是在過程或函數裏調用自身; windows
舉個例子來講:函數
從前有座山,山上有座廟,廟裏有一個老和尚和一個小和尚,老和尚正在給小和尚講故事。學習
講的是什麼故事呢?他說,從前有座山,山上……spa
咱們發現這個故事是一直重複講述的,咱們以前是經過循環結構來實現重複執行某些代碼的,那麼如何經過遞歸代碼來實現這個故事呢? 咱們來看下面這段代碼:設計
#include "windows.h" void tell_story( ) { printf("從前有座山,山上有座廟,廟裏有一個老和尚和一個小和尚\n"); printf("老和尚正在給小和尚講故事。講的是什麼故事呢?他說:\n"); Sleep(1000); tell_story ( ); // tell_story 函數的遞歸調用 } void main() { tell_story( ); }
咱們發現, 經過遞歸調用,也就是函數調用自身這一方法來實現講故事這以代碼,代碼是能夠執行的,可是卻造成了一個死循環.以前咱們學習循環的時候,咱們對循環是有控制條件的,那麼在咱們使用遞歸的時候是否應該和使用循環同樣,應該有個控制遞歸的條件呢?這個控制條件應該是什麼呢?code
注意:
遞歸就是在過程或函數裏調用自身;
在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。htm
/* 漢諾塔遊戲解決過程*/ #include "stdio.h" //整型全局變量,預置1,步數 int step=1; //void表示該函數沒有返回值,只是執行了一些操做 void move(int m,char p,char q,char r) { if(m==1) //若是m爲1,則爲直接可解結點 { //輸出移盤信息 printf("第%d步 move 1# from %c to %c\n",step,p,r); //步數加1,準備進行下一步 step++; } else { move(m-1,p,r,q);//遞歸調用move(m-1) //直接可解結點,輸出移盤信息 printf("第%d步 move %d# from %c to %c\n",step,m,p,r); //步數加1 step++; //遞歸調用 move(m-1,q,p,r); } } void main() { int n; printf("請輸入盤數:"); scanf("%d",&n); printf("在3根柱子上移%d只盤的步驟爲\n",n); move(n,'A','B','C'); }
/* Note:Your choice is C IDE */ #include "stdio.h" int fun(int n) { if(n==1||n==2) return 1; else return fun(n-1)+fun(n-2); } void main() { int n; printf("請輸入月數:"); scanf("%d",&n); printf("%d月有%d對兔子\n",n,fun(n)); }
#include "stdio.h" int fun(int n) { if(n==1) return n; else return n*fun(n-1); } void main() { int n; printf("請輸入一個數:"); scanf("%d",&n); printf("%d!=%d\n",n,fun(n)); }