作者JonathanWang (尹兒)
看板b95902HW
標題[課程] 遞迴的真諦..
時間Fri Oct 13 02:45:04 2006
遞迴就是函數呼叫, 雖然它似乎很特別, 是呼叫自己..
但如果徹底了解函數呼叫的話, 會發現它沒有什麼特別的 :)
我想, 遞迴令人覺得玄妙的地方有兩個:
1. 遞迴函數的「裡面」會呼叫自己, 當我們遞迴函數裡面要呼叫自己的地方時,
整個遞迴函數是還沒有寫完的 (因為還正在寫它的裡面),
感覺很像在呼叫一個還沒有完成的函數..
2. 遞迴函數重覆地呼叫自己, 所以免不了地, 會使用到完全一樣名稱的變數,
那麼它們會不會互相踐踏?
對於第 1 個問題:
電腦在執行你的程式時, 你的整個程式都是完成的, 所以要遞迴呼叫的時候,
電腦所面對的, 是一個已經完成,完整的函數, 所以電腦不會有這個困擾.
而需要克服的, 是你在寫程式時的心理障礙, 你應該假想你已經完成了,
假想你呼叫的是一個已經寫好的程式...
對於第 2 個問題:
(希望你已經完全看懂上面那一篇「今天晚上講的幾種變數..」)
遞迴函數裡面可能會有的變數有三種: 參數, 區域變數, 靜態變數.
其中參數和區域變數幾乎是一樣的,
每一次這個函數 (就算它不是遞迴函數) 被呼叫的時候,
它們都會「重生」出來, 所以每一層的呼叫 (遞迴函數一次又一次呼叫自己,
我們習慣稱它叫作第一層, 第二層, 第三層, ...),
用的都是那一層自己獨有的變數, 函數裡的程式碼在執行的時候,
都只會用到那一層的變數 (參數+區域變數), 而不會也無法用到其他層的.
而靜態變數的話, 它是永生不死, 也不會重生的,
所以整個程式裡頭不管是哪一次呼叫, 用的都是同一份.
(附帶一提, 在遞迴函數裡面, 當然也像在其他函數裡面的時候一樣,
可以使用全域變數, 只是全域變數應該在函數外頭宣告,
而不會在函數裡頭宣告, 而且全域變數也是永生不死的,
貫串整個程式, 用的都是同一份)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.44
1F:推 yease:謝謝:] 10/13 08:13
2F:推 waterwinds:助教辛苦了~~~~ 10/13 09:42
3F:→ locationc:可以想成呼叫一個和自己一模一樣的函數吧 10/14 01:03