遞歸函數詳解——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行那條語句ide

F10逐過程(不進入函數內部,一個函數是一個過程)函數

F11逐語句(進入函數裏的每一條語句)學習

若要跳出函數按shift+F11spa

 

Watch Auto 兩個監視窗口均可以看變量值調試

 

 

回到調試遞歸函數這裏,在第15行打斷點,而後一直點下一步(這方法也叫單步調試)code

而後咱們能夠發現:blog

 

函數會執行到遞歸處,由於遞歸在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 是如何運行的 - 知乎

相關文章
相關標籤/搜索