我一整天都在震撼着我的大脑,而我仍然无法得到它。有人可以向我解释一下,这个功能究竟是如何起作用的?!?!?!
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");
}
console.log(findSolution(24));
// → (((1 * 3) + 5) * 3)

如何在无限循环中不停地来回调用?
答案 0 :(得分:1)
您可以在递归函数的第一行添加console.log
并观察正在发生的事情。
我将函数更改为没有else
部分的版本,因为所有if
语句都会返回。
功能保持不变。
在函数find
中,有两个退出条件,一个隐藏:
检查目标值,(好吧,这很明显)
检查当前值是否大于目标值,然后以null或任何其他falsy值退出,因为返回值用于下一个隐藏检查。
选中logical OR ||
,如果
find(current + 5, `(${history} + 5)`)
返回truthy值,如果不返回其他函数调用的结果
find(current * 3, `(${history} * 3)`)
带有truty或falsy值(不带支票)。
一起开始时需要一个,并尝试添加5
或乘以3
,直到达到所需的值。
function findSolution(target) {
function find(current, history) {
console.log(current, history);
if (current == target) {
return history;
}
if (current > target) {
return null;
}
return find(current + 5, `(${history} + 5)`) || find(current * 3, `(${history} * 3)`);
}
return find(1, "1");
}
console.log(findSolution(24)); // (((1 * 3) + 5) * 3)

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
基本上,那个测试:
if (current == target) {
return history;
}
测试是否找到了解决方案,然后返回该解决方案
同时进行测试:
if (current > target) {
return null;
}
发现 无法找到解决方案 ,然后返回null。
例如,如果您尝试findSolution(10)
,则会获得null。
否则,如果我们不处于其中一个递归结束条件,代码将继续搜索并构建解决方案字符串。
因此,此代码将尝试构建" + 5"的所有可能组合。和" * 3"直到它产生给定的数字,或者如果组合产生更大的数字,则为null。