function findSolution(target) {
function find(current, history) {
if (current == target)
{debugger;
return history;
}
else if (current > target){
debugger;
return null;
}
else{
debugger;
return find(current + 5, "(" + history + " + 5)") ||
find(current * 3, "(" + history + " * 3)");
}
}
debugger;
return find(1, "1");
}
console.log(findSolution(13));
在它到达find之后工作期间(33,"(((1 + 5)+ 5)* 3)")为什么这会从之前删除+5而不是* 3它刚刚叫?
代码的工作:
find(1, "1")
find(6, "(1 + 5)")
find(11, "((1 + 5) + 5)")
find(16, "(((1 + 5) + 5) + 5)")
too big
find(33, "(((1 + 5) + 5) * 3)") //why does this remove +5 from earlier and not *3 it just called
too big
find(18, "((1 + 5) * 3)")
too big
find(3, "(1 * 3)")
find(8, "((1 * 3) + 5)")
find(13, "(((1 * 3) + 5) + 5)")
found!
答案 0 :(得分:3)
每次find()
次调用都会产生新的本地history
。您的递归调用不会更改 history
;他们创造新的字符串。
因此在
return find(current + 5, "(" + history + " + 5)") ||
find(current * 3, "(" + history + " * 3)");
首先使用+ 5
表单调用该函数,如果返回null
,则使用* 3
表单调用该函数。所以+ 5
永远不会被删除&#34 ;;该字符串被简单地丢弃。
此外,对于||
,如果左侧表达式返回非null,则根本不评估右侧。