这是Eloquent Javascript的示例:
通过从数字1开始并重复加5或乘以3,可以产生无限数量的新数字。给定一个数字,您将如何编写一个函数,以查找产生该数字的加法和乘法序列?
我无法理解递归在这里的工作方式,想知道是否有人可以多次写出find的调用方式或其他解释。
function findSequence(goal) { function find(start, history) { if (start == goal) return history; else if (start > goal) return null; else return find(start + 5, "(" + history + " + 5)") || find(start * 3, "(" + history + " * 3)"); } return find(1, "1"); } console.log(findSequence(24)); // => (((1 * 3) + 5) * 3)
该函数运行带有 回溯 功能的相当简单的 蛮力搜索 :在每个调用级别,它都尝试将数字加到该数字上,并查看是否从结果数字开始将您带到目标。如果是,则返回结果;否则,返回结果。否则,将数字乘以,然后从该新数字继续搜索目标。随着递归的进行,生成数字的表达式的文本表示形式将传递到下一个调用级别。 __5``3
5``3
搜索14如下:
14
(1, "1") (5, "1+5") (10, "(1+5)+5") (15, "((1+5)+5)+5") <<= Fail (30, "((1+5)+5)*3") <<= Fail (15, "(1+5)*3") <<= Fail (3, "1*3") (8, "(1*3)+5") (13, "((1*3)+5)+5") (18, "(((1*3)+5)+5)+5") <<= Fail (39, "(((1*3)+5)+5)*3") <<= Fail (24, "((1*3)+5)*3") <<= Fail (9, "(1*3)*3") (14, "((1*3)*3)+5) <<= Success!