这个问题非常类似于这个帖子Javascript..totally lost in this tutorial。
function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
print(findSequence(24));
我被困在这个部分:
find(start * 3, "(" + history + " * 3)");
每次开始超越目标它会做什么?它说它返回null但是当我测试并在
上放置断点时 if (start == goal) it shoes this on the console
history: "(((((1 + 5) + 5) + 5) + 5) + 5)"
start: 26
history: "(((((1 + 5) + 5) + 5) + 5) * 3)"
start: 63
它加起来* 3并取消+5,我不明白怎么做。
答案 0 :(得分:2)
退货声明:
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
是涉及“||”的表达式运营商。该运算符将导致左侧被评估。如果结果不为null,为零,false
或空字符串,则返回该值。如果它是那些“假”值之一,则评估并返回第二个表达式。
换句话说,可以像这样重写:
var plusFive = find(start + 5, "(" + history + " + 5)");
if (plusFive !== null)
return plusFive;
return find(start * 3, "(" + history + " * 3)")
如果“start”超过“goal”,则该函数返回null。当然,如果两个替代方案都不起作用,那么整个事情将返回null。
答案 1 :(得分:0)
表达式:
find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)")
首先会尝试评估:
find(start + 5, "(" + history + " + 5)")
如果返回的值不为null,0,false或空字符串,则语句将计算为返回值。 如果返回的值为null,0,false或空字符串,则接下来将评估以下内容:
find(start * 3, "(" + history + " * 3)")
如果返回的值不为null,0,false或空字符串,则语句将计算为返回值。 如果返回的值为null,0,false或空字符串,则语句的计算结果为null,0,false或空字符串(以* 3函数调用返回的为准)。
所以这一行:
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)")
就像是说“我打算通过猜测我在这一步添加5来试图找到解决方案,如果这不起作用,我会尝试在这一步乘以3,如果不是不行,我放弃了!“