aju*_*shi 5 javascript recursion
我正在阅读Eloquent JavaScript,我遇到了这个难题的例子:
考虑这个难题:从数字1开始并重复加5或乘以3,可以产生无限量的新数字.你会如何编写一个函数,给定一个数字,试图找到一个产生该数字的加法和乘法序列?
这是解决方案的代码:
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");
}
print(findSequence(24));
Run Code Online (Sandbox Code Playgroud)
如果没有参数start和goal的值,有人可以清楚dod find如何执行?递归是怎么发生的?
但find 并没有获得而不值执行start和goal.这是第一次用值来执行1的start,并为唯一的价值goal是24.
也许你对操作的顺序感到困惑.在那里我们看到了一个函数的声明,findSequence.在声明期间,不执行任何代码.该findSequence函数仅在最后一行执行,执行函数的结果打印出来.
在声明中findSequence,有另一个函数的声明,find.再一次,直到后来它才会被执行.该findSequence函数只有一个可执行的代码行,即调用的代码行find(1, "1").执行该一行会find递归地触发执行若干次.该find功能参考goal; 当Javascript解释器执行代码时,goal总是引用参数findSequence,并且因为在这个例子findSequence中只调用一次,所以goal总是具有相同的值,24.
您应该能够看到递归发生的位置.如果start等于goal,则函数停止; 它返回它到达该数字的历史.如果start大于goal,则返回null,表示该路径不是目标号的路径.如果start仍然小于goal,则该函数尝试使用其起始值加5 来调用自身.如果返回非空值,那么返回的是.否则,它会尝试乘以3并返回该历史值.
请注意,虽然此代码可以返回许多数字,但它不能返回所有数字.2例如,如果目标是findSequence返回,null因为无法通过添加或乘以来开始1并获得.253
| 归档时间: |
|
| 查看次数: |
1809 次 |
| 最近记录: |