所以我从Eloquent JS获得了这段代码:
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");
}
console.log(findSolution(24));
我的问题是 null 在此递归中做了什么?当我们到达以下地点时:
find(26, history) // start = 26, history = (1+5)+5)+5)+5)+5)
它命中start > tagert
语句,返回 null 。
接下来会发生什么?
答案 0 :(得分:0)
||
运算符是返回第一个或第二个调用结果的快捷方式。如果对find
的第一次调用返回null,则返回第二次的结果。
在这种情况下无效意味着达到目标的方法不成功。函数findSolution
基本上会尝试+ 5
和* 3
的所有组合来达到目标。
答案 1 :(得分:0)
问题是带有空值的“或”(||)。
function findSolution(target) {
function find(start, history) {
if (start == target)
return history;
else if (start > target)
return null;
else
{
var result = find(start + 5, "(" + history + " + 5)");
if(result != null)
return result;
else
return find(start * 3, "(" + history + " * 3)");
}
}
return find(1, "1");
}
console.log(findSolution(24));
其他解决方案:
function findSolution(target) {
function find(start, history) {
if (start == target)
return history;
else if (start > target)
return false;
else
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
结果是:
(((1 * 3) + 5) * 3)
答案 2 :(得分:0)
我试一试:
find函数只能返回2个值:字符串历史记录或null。一旦达到任何停止条件:start == target
或start > target
,这将是整个递归调用的结果。
现在,对于每个递归调用,代码最多可以创建2个递归调用。如果对find(start + 5, "(" + history + " + 5)")
的调用返回null(记住它只能返回null或历史记录),那么find(start * 3, "(" + history + " * 3)")
将作为另一次尝试返回历史记录执行,如果第二次调用也返回null,那么null将是你的最终结果