iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0

「遞迴是不是其實也用到了 Stack 啊?」我好奇地問,因為剛剛聽起來遞迴是找到最簡單的答案之後,倒退回來做困難的。

「沒錯,不只遞迴,所有函式呼叫都會用到 Stack。」小孩淡定地回答。

「咦?可我平常呼叫函式都沒什麼感覺啊?」

「想像一下,你在處理文件。每次呼叫函式,就像有人在你桌上放一份新的文件。你只能從最上面那份開始處理,處理完再交回去。平常你只呼叫一兩個函式,文件堆得不高,所以不容易察覺。但遞迴的特性是『不停呼叫自己』,文件一下子就疊得高高的,你當然會發現那是個堆疊。」

「喔——原來如此。」

「所以說,遞迴雖然寫法直覺、符合人腦思路,但其實不太建議常用。」

「為什麼?」

「因為電腦的記憶體是有限的啊。就像桌子一樣,文件堆太高會整個倒掉。當堆疊滿了,就會發生 Stack Overflow。」

「所以,只要確定不會堆太高,用遞迴也沒問題囉?」

「對。但要小心,有些情況註定會推得超高。比如 Tree 的 DFS,深度只有兩三層當然沒問題,可是如果深度幾千、幾萬層,就很危險了。」

「那該怎麼辦?」

「通常會用迴圈來改寫。因為迴圈就像對方只會在你清空桌子後,才給你下一份文件。你的桌子永遠保持乾淨。」

「可是……要是我還想不到怎麼把遞迴轉成迴圈呢?」

「那你可以先用『尾遞迴』。它看起來是遞迴的寫法,但編譯器會偷偷幫你改寫成迴圈,不會真的堆滿 Stack。」

「這麼好!」我眼睛一亮。雖然不知道編譯器是誰,但他真的是個好人。

「對呀。放心交給編譯器吧。」小孩笑著眨了眨眼。

旁邊的電腦彷彿回應般地發出『喀噠喀噠』的聲音。


上一篇
遞迴藏鏡人
系列文
奶茶裡藏的資料結構(Kotlin範例)29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言