我的入门教程突然变得非常先进。我不知道这个程序是如何工作的。你能用简单的语言解释一下吗?
最后它打印(((1 * 3)+ 5)* 3),但我根本没有得到它。据我所知,findSequence传递了24,触发函数find。我假设函数find被传递1,“1”,后者被分配给历史?但是我不明白为什么第二个1用引号“1!”,当它返回find时,我也不理解使用引号(开始等等。
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));
答案 0 :(得分:4)
您有一个“输出”字符串(((1 * 3) + 5) * 3)
,一个目标24
和一个第一个字符1
。 1
是1 * 3
中的1。该程序将汇编一个包含数学表达式的字符串,添加(),* 3和+5以尝试获取目标。 find
函数的两个参数是当前总数和将生成总计的表达式。显然,表达式是一个字符串。该查找将当前总数与目标进行比较,如果它相等则表达式是正确的并且如果当前总数> 1,则返回该表达式。然后他失败并返回null。另外,他在表达式中添加了一些操作。他尝试了两种“方式”,一种是将当前结果乘以* 3,另一种是将+5加到当前结果中。它在树上是递归的(因此每次他将在两个递归调用中分叉)。 null ||某事==某事,所以发现响应的分支将返回他的响应,另一分支将返回null并且“获胜”响应将被传回。
让我们说目标是11。
为了更清楚,请尝试以下版本:
function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else {
var ret = find(start + 5, "(" + history + " + 5)");
if (ret == null)
ret = find(start * 3, "(" + history + " * 3)");
return ret;
}
}
return find(1, "1");
}
print(findSequence(24));
而且,在这里,你只能得到+和*
而不是表达式function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else {
var ret = find(start + 5, history + "+");
if (ret == null)
ret = find(start * 3, history + "*");
return ret;
}
}
return find(1, "1");
}
print(findSequence(24));
请注意,作为一个例子,它非常复杂,因为它使用了闭包(本地定义的函数)。
答案 1 :(得分:0)