javascript - 无法理解这个递归示例
问题描述
所以在 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
.
推荐阅读
- php - 为什么会话变量仅将最后一行数据发送到另一页
- sass - Nativescript 复合组件
- linux - 使用相同的目标和变量名调用 cmake target_link_libraries() 不会附加请求
- python - 生成器表达式如何在 python 内部工作?
- asp.net-core - Azure Devops UnitTest 未找到“.deps.json”文件
- sql - 更新 SQL 数据,但数据包含 ' 所以出现错误
- c# - 如何正确设置 ReadBarcodes
- javascript - 当我们调用 web api 函数时,javascript 是否会创建执行上下文?
- angularjs - 如何使用 AutoHotKey 成功填充角度输入字段?我可以设置该值,但会收到一条提示未输入任何内容的消息
- windows - WM_DPICHANGED 减小窗口大小