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語言入門,另外數據結構的書還有不少,找書我通常在知乎看別人回答推薦
附上: