Eloquent Javascript 引入了一個具有挑戰性的問題:編寫一個函數來產生一系列加法和乘法以達到給定法的目標數字。提供的程式碼使用了遞歸,這引發了對其操作的疑問。
findSequence 函數中存在一個巢狀函數 find。此函數遞歸地探索目前數字的兩種可能的轉換:加 5 或乘以 3。每次轉換都會產生一個新數字,並且該過程將繼續,直到達到目標或當前數字超過目標。
在每個步驟中,都會傳遞表達式的文字表示。例如,從數字1開始,初始表達式為“1”。如果選擇加 5,則表達式變為「(1 5)」。透過記錄這些表達式,該函數可以追蹤達到每個數字所採取的步驟。
如果達到目標,則最後一步的表達式表示有效序列。否則,函數傳回null,表示失敗。進行多次遞歸調用,每次探索不同的路徑,直到找到有效序列或所有路徑都已用盡。
為了說明遞歸,讓我們考慮找出目標編號 14 的序列。
(1, "1") (5, "1 + 5") (10, "(1 + 5) + 5") (15, "((1 + 5) + 5) + 5") // Discard, exceeds goal (30, "((1 + 5) + 5) * 3") // Discard, exceeds goal (15, "(1 + 5) * 3") // Discard, exceeds goal (3, "1 * 3") (8, "(1 * 3) + 5") (13, "((1 * 3) + 5) + 5") (18, "(((1 * 3) + 5) + 5) + 5") // Discard, exceeds goal (39, "(((1 * 3) + 5) + 5) * 3") // Discard, exceeds goal (24, "((1 * 3) + 5) * 3") // Discard, exceeds goal (9, "(1 * 3) * 3") (14, "((1 * 3) * 3) + 5") // Success!
透過這個逐步遞歸的過程,函數最終找到序列:“((1 3) 3) 5”,它代表1 和3 的乘積加上5 .
以上是“FindSequence”函數中的遞歸如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!