我正在阅读 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));
有人可以弄清楚如果 dod find 没有参数 start 和 goal 的值,它是如何执行的吗?另外,递归是如何发生的?
But find
didn't在没有值的情况下被执行start
and goal
。它首先以该值执行1
for start
,唯一的值是goal
was 24
.
也许您对操作顺序感到困惑。在那里我们看到宣言的一个函数,findSequence
。在声明期间,不执行任何代码。这findSequence
函数只会在最后一行执行,并打印出执行函数的结果。
声明内findSequence
,有另一个函数的声明,find
。再一次,它直到稍后才被执行。这findSequence
函数刚刚one可执行代码行,即调用的代码行find(1, "1")
。执行这一行会触发执行find
递归地进行一定次数。这find
函数引用了goal
;当Javascript解释器执行代码时,goal
始终引用参数findSequence
,并且因为在这个例子中findSequence
只被调用一次,goal
始终具有相同的值,24
.
您应该能够看到递归发生的位置。如果start
等于goal
,则函数停止;它返回如何得出该数字的历史记录。如果start
大于goal
,然后返回null
,表明该路径不是到达目标号码的路径。如果start
仍小于goal
,然后该函数尝试自称其起始值加 5。如果返回非空值,则这就是返回的值。否则,它会尝试乘以 3 并返回该历史值。
请注意,虽然此代码可以返回许多数字,但它不能返回all数字。如果目标是2
, 例如,findSequence
将返回null
因为没有办法从1
并到达2
通过增加5
或乘以3
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)