c語言日記——遞迴
首先,允許我從《c primer plus》中摘一句話:c允許函式呼叫它自己,這種呼叫稱為遞迴。
有一段時間一直搞不清楚遞迴的實質,直到看到如下**:
#include
int up_and_down(int n);
int main()
int up_and_down(int n)
執行結果:
level 1:n location 012ffb3c
level 2:n location 012ffb2c
level 3:n location 012ffb1c
level 4:n location 012ffb0c
level 4:n location 012ffb0c
level 3:n location 012ffb1c
level 2:n location 012ffb2c
level 1:n location 012ffb3c
請按任意鍵繼續. . .
這個結果當你認識遞迴後就不會覺得有半點奇怪了。
想要真正搞懂遞迴,這段**值得上機推敲,最好用除錯一步步看看程式的執行順序。
這裡講下我的個人理解:
首先程式執行主函式main(),在裡面呼叫up_and_down()函式(此時引數為n=1,記住在主函式中該函式只呼叫了一次,雖然這句話有點多餘但我還是覺得有必要提醒)
接著進入了被調函式up_and_down()(這裡的被調函式是相對main()而言)
在up_and_down()中,首先列印#1(看上面**注釋)
然後執行up_and_down(1+1),即在up_and_down(1)中呼叫up_and_down(2)
在這裡up_and_down(1)為up_and_down(2)的主調函式,後者則為前者的被調函式
記住這點就好理解了,我們都知道在乙個函式中,呼叫另乙個函式執行完以後要返回主調函式
即在up_and_down(1)中呼叫up_and_down(2)
在up_and_down(2)中呼叫up_and_down(3)
在up_and_down(3)中呼叫up_and_down(4)
直到up_and_down(4)列印完#1後不符合(n<4)停止呼叫,隨即跳過if語句直接列印#2
在這裡會發現#2是第一次列印,因為在前面幾次呼叫中都還沒執行到列印#2這段**
重點來了,列印完#2後意味著up_and_down(4)呼叫完畢了,則按照上面說的呼叫完後返回主調函式
而up_and_down(4)的主調函式是up_and_down(3)
返回up_and_down(3)後程式繼續執行,在up_and_down(3)中列印#2(因為在之前up_and_down(3)呼叫了up_and_down(4),未來得及執行列印#2)
up_and_down(3)列印#2後就等於up_and_down(3)呼叫完畢了,這裡我們又要記住up_and_down(3)是在up_and_down(2)中被呼叫的,呼叫完後返回up_and_down(3)的主調函式up_and_down(2)
同理up_and_down(2)呼叫完後返回至up_and_down(1),而up_and_down(1)才是真正的主函式main()的被調函式,up_and_down(1)執行完畢後返回至main()函式,main()函式再繼續執行剩下的**,這裡是return 0;
囉嗦了那麼多,其實第一遍看完可能還是捋不清,在這裡需要記住,遞迴其實就是函式自己不斷呼叫自己,弄清楚遞迴完一層要返回哪一層,**的執行順序都是從上往下的,耐心點一步步看下去兩三遍後就會恍然大悟。
以上純為個人理解,如有錯誤希望指出,大家一起學習,共同進步!
C語言開發日記
1,visual stadio 中 alt f8 格式化 2,c中getch 函式是用於輸入乙個char型變數 經常用於螢幕等待 例如你想讓螢幕內容 停留一會 提示使用者按任意鍵繼續 這時就可以用getch int ch cputs type y when finished typing keys ...
C語言日記3
ex 03 01 題目 輸入為若干整數,以 1結束 測試資料保證這組數中只有最後乙個 1 輸出共兩行,第一行為三個整數 用乙個空格分隔 依次為這組數中正數的個數,0的個數和負數的個數 不統計最後的 1 第二行為用乙個空格分隔的兩個整數,依次為這組數中所有正數的和及所有負數的和 不包括最後的 1 測試...
高斯日記(C語言)
高斯日記 大數學家高斯有個好習慣,無論如何都要記日記。他的日記有個與眾不同的地方,他從不註明年月日,而是用乙個整數代替。比如,4210 後來人們知道那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許 也是個好習慣,它時時刻刻提醒著主人,日子又過去一天。還有多少時光可以用於浪費呢 高斯出生於 ...