1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int recursion(int); 5 6 int S = 0; 7 8 int main(void) { 9 recursion(10); 10 system("pause"); 11 return 0; 12 } 13 14 int recursion(int i) { 15 printf("i:%d S為%d\n",i,S); 16 if (i > 0) { 17 return S += recursion(i - 1); 18 printf("返回到%d", S); 19 } 20 else return 1; 21 }

stdlib.h提供system()函數原型
第4行代碼是函數聲明,這樣就不需要把子函數定義代碼寫在main()前面了
第6行是全局變量
請跟着本教程調試,因為純看文字不僅看不懂還頭疼,動手才能理解(都怪樓主文字表達能力極差emm...)
我們把斷點打在第15行,然后就“逐語句調試”
關於調試按鈕的介紹:
Continue 是執行到下一個斷點處時才暫停,對於這里的遞歸函數,下一個斷點還是第15行那條語句
F10逐過程(不進入函數內部,一個函數是一個過程)
F11逐語句(進入函數里的每一條語句)
若要跳出函數按shift+F11
Watch Auto 兩個監視窗口都可以看變量值
回到調試遞歸函數這里,在第15行打斷點,然后一直點下一步(這方法也叫單步調試)
然后我們可以發現:
函數會執行到遞歸處,因為遞歸在return之前執行,所以函數一直調用自己執行但不返回(只有到被調用的函數執行到結尾return,也就是結束了,才能繼續執行上一層函數的return),直到20行的return 1;被執行了,這樣有一個函數返回了(也就是最深處被調用的函數執行到了結尾處),然后次深處的函數才能繼續執行到return 也就是次深層函數自己的結尾。
也就是函數遞歸調用自己,只要沒有return,函數就沒有執行完成(另外return void其實也算是一種return ),
所有的函數都在等待自己調用的那一個函數執行完成,
【仿佛一個公司,上級先做一部分事情,再分配其中一些關鍵任務給下級 並等待下級執行完成,下級完成后他們才能繼續做這件事。上級有自己的上級和下級,下級也有自己的上級和下級,emmm...】
關於這句return S += recursion(i - 1);
只有recursion(i-1)執行完成后並返回了一個值X,系統才能把S的值加上返回值X再賦值給S
PS. return是函數的結尾,因此如果return后面還有語句,那也是無效的,return后面的語句根本不會被執行
結論:函數在沒有return之前是不會結束的,遞歸利用這個特性,不斷調用着自己,直到最后一個自己的分身return結束了,才能回到上一層繼續執行,然后逐層return,最后回到最開始時那個函數
單數字表示第n層遞歸函數,數字加r表示第n層函數執行結束 1 2 3 4 4r 3r 2r 1r
本文結束,以下是一些無關的事物:
其實,我們對調試一無所知,GDB調試打印大法:為什么一般調試程序bug的時候,都用printf來調試(printf大法),cout不行嗎? - Renleilei92的回答 - 知乎
以及匯編 宏 Linux編程,這一切的一切,和C語言相關的東西,我們都一無所知,甚至Github我們都不知道怎么用,我不經會想,如果僅靠大學課堂,我們能懂什么?
而且大學計算機教材是一如既往的爛到底,把一門工科變成純理科,凡是知識決口不提它的用處妙處,先要求你強制學會再說。就如二叉樹,
教材里一開門就直接講了二叉樹的樣子,像極了數學題,全然不告訴你它的用處妙處,而我在<C Primer Plus 中文版>書里看到的卻是:
不太記得了,概況一下就是
現在需要從一個有順序的列表里找到一位顧客的信息,這列表里有A到Z排序的顧客名字,對於一個排好序的列表可以用折半搜索(二分法)比順序搜索好得多
假如列表有127項,那么順序搜索平均要64次比較,而折半搜索只需最多7次比較 (2的7次方是128)
這樣我們發現效率極高
但是這樣有個壞處,每次加入新內容,列表都要排序一下,如果在需要頻繁改動列表的情景下,這種順序表(無論是數組還是單鏈表)會很麻煩。
另一種形式,二叉樹,可能正是您所需要的。
二叉樹結合了折半搜索策略的鏈接結構,如圖
這本書基本上以應用為情景,帶讀者學習,很真實地模擬了一個需求場景,並堅持不懈地帶着讀者理解並學習各種新東西(最重要的是這本書內容全面完整,關鍵點細講不會讓你迷迷蒙蒙)
讀了這本書,我真的覺得,學習一定要有一本好書,不好的書只會讓你一頭霧水並丟失學習的熱情
這本適合c語言入門,另外數據結構的書還有很多,找書我一般在知乎看別人回答推薦
附上:
深入理解計算機系統(二):Hello World 是如何運行的 - 知乎