我在教科书中遇到了这个递归函数的例子。我可以看到这个网站上有其他线程从Eloquent JavaScript中提出有关这个例子的问题,但是用户理解这个例子的困难在于不了解如何调用函数。
function findSolution(target){
function find(start, history){
if(start == target)
return history
else if(start > target)
return null
else
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)")
}
return find(1, "1");
}
你为findSolution函数提供了一个目标数字,它执行内部函数find,它调用自身,直到找到通过加5或乘以3来达到目标数的方法。假设我提供的数字13为要达到的目标。参数增量如下。
Start = 1 + 5, History = "(1 + 5)"
Start = 6 + 5, History = "(1 + 5) + 5"
Start = 11 + 5, History = "(1 + 5) + 5) + 5"
开始变为16,并且高于13,因此这将返回null。因此,find函数尝试将3开始乘以而不是添加5,返回11 ...
Start = 11 * 3, History = "(1 + 5) + 5) * 3"
这也太高了,所以会返回null。当然这个功能在这里停了,对吧?
当我测试它时,控制台在每次查找递归调用自身时记录起始值,它继续调用自身,直到它达到13号。函数在33之后循环的起始值为:
18
3
8
13
但这怎么可能呢?该函数在达到16和33之后才能返回false吗?
答案 0 :(得分:1)
基础案例之前的Console.log历史记录。这将有助于理解它是如何工作的
答案 1 :(得分:0)
您的(示例)代码中存在语法错误。它应该是这样的:
function findSolution(target){
function find(start, history){
if(start == target)
return history
else if(start > target)
return null
else
return (find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)"))
}
return find(1, "1");
}
(注意内部函数中最后一个返回的结构。)
当输入13运行更新的函数时,我在控制台中看到了这一点:
(((1 * 3)+ 5)+ 5)