C語言日記 遞迴

2021-07-25 19:38:32 字數 1808 閱讀 9106

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 後來人們知道那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許 也是個好習慣,它時時刻刻提醒著主人,日子又過去一天。還有多少時光可以用於浪費呢 高斯出生於 ...