C語言容許函數調用它本身,這種調用的過程稱爲「遞歸(recursion)」函數
舉例說明,以下代碼:spa
#include <stdio.h> void up_and_down(int); int main(void) { up_and_down(1); return 0; } void up_and_down(int n) { printf("Level %d: n location %p\n",n,&n); if (n < 3) up_and_down(n+1); printf("LEVEL %d: n location %p\n",n,&n); }
定義一個函數up_and_down(int n),且函數當中再次調用自己。下面是程序運行效果:3d
[root@MiWiFi-R4-srv C]# cc recur.ccode
[root@MiWiFi-R4-srv C]# ./a.out
Level 1: n location 0x7ffdbc113dac
Level 2: n location 0x7ffdbc113d8c
Level 3: n location 0x7ffdbc113d6c
LEVEL 3: n location 0x7ffdbc113d6c
LEVEL 2: n location 0x7ffdbc113d8c
LEVEL 1: n location 0x7ffdbc113dacblog
代碼分析;函數up_and_down(int n)中在包含if語句,符合條件變再次調用自身,那麼可將up_and_down(int n)分解寫成以下形式:遞歸
void up_and_down(int n) //根據主函數賦值,n=1; {
printf("Level %d: n location %p\n",n,&n);
//輸出顯示:Level 1 :n ............. if (n < 3) //斷定n=1,且小於3;則進入if語句。 { n = n + 1; //在if語句中,n被從新賦值,且值爲2。 printf("Level %d: n location %p\n",n,&n);
//輸出顯示:Level 2 :n ............. if (n < 3) //再次遇到if語句,n等於2,條件語句爲真,則執行if語句。 { n = n + 1; //n被從新賦值,且值爲3。 printf("Level %d: n location %p\n",n,&n);
//輸出顯示:Level 3 :n ........... if(n < 3) //執行斷定語句,條件語句爲假,則跳過if語句。 up_and_down(n+1); printf("LEVEL %d: n location %p\n",n,&n); //執行語句,輸出顯示:LEVEL 3 :n ......... } printf("LEVEL %d: n location %p\n",n,&n); //執行語句,輸出顯示:LEVEL 2 :n ............ } printf("LEVEL %d: n location %p\n",n,&n); //執行語句,輸出顯示:LEVEL 1 :n ........ }
分析代碼行爲以下。io
1;n 接收到主函數值爲1,運行printf()函數,以後斷定if語句,條件爲真則繼續調用自己,執行printf()函數,斷定if語句。直到if條件爲假,中止調用自己。class
2;當 n 的值爲3 時。if條件語句爲假,則跳過if語句,執行printf("LEVEL %d: n location %p\n", n , &n);(注意:此時n的值爲3).程序
3;當遞歸函數(n值爲3時)執行結束,則將控制權返回給上一級遞歸(n的值爲2)的時候,繼續完成遞歸函數。重複行爲,直到返回到主函數,即n的值爲1的時候。db