我正在阅读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));
如果没有参数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
并获得.2
5
3