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中文网其他相关文章!