问题描述
所以在 Eloquent JavaScript 的第 3 章中有这个递归示例,它是这样的:考虑这个谜题:从数字 1 开始,重复加 5 或乘以 3,一个无限的集合 号码可以生产。你会如何编写一个函数,给定一个数字,试图找到一系列这样的加法和 产生那个数字的乘法?
给定的代码是..
function findSolution(target) {
function find(current,history) {
if (current == target) {
return history;
} else if (current > target) {
return null;
} else {
return find(current + 5,`(${history} + 5)`) ||
find(current * 3,`(${history} * 3)`);
}
}
return find(1,"1");
}
现在有几件事我不明白。就像我们第一次调用函数一样,它会返回什么?它会返回(1,"1")而忽略内部函数find吗? >
以及示例中的当前和历史是什么?我不记得给它们赋值?
解决方法
第一次调用 findSolution()
时,它将返回该函数 find(1,"1")
最后一行的结果。在这种情况下,“1”是历史,它是通过调用 find
来设置的。 current
的值为 1,这是 find(1,"1")
要理解的重要一点是,您正在调用一个正在调用新定义的函数 find
的函数。该函数的结果将递归调用自身,这是留给读者(您)的练习。无论结果如何,findSolution
都会返回。