遞歸函數詳解——VS調試教你理解透徹遞歸


 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 是如何運行的 - 知乎




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM