我的入门教程突然变得非常高级了。我不知道这个程序是如何工作的。你能用通俗的语言解释一下吗?
最后它打印了 (((1 * 3) + 5) * 3),但我根本不明白。 我知道 findSequence 传递了 24,这会触发函数 find。我假设函数 find 传递了 1,"1" ,后者被分配给历史记录?但我不明白为什么第二个1在引号“1!”中,也不明白返回find(start等时引号的使用。
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));
您有一个“输出”字符串
(((1 * 3) + 5) * 3)
、一个目标 24
和第一个字符 1
。 1
是 1 * 3
中的 1。该程序将组装一个包含数学表达式的字符串,添加 ()、*3 和 +5 以尝试获得目标。 find
函数的两个参数是当前总计和将生成总计的表达式。显然表达式是一个字符串。 find 将当前总数与目标进行比较,如果相等,则表达式正确并返回它,如果当前总数 > 目标,则失败并返回 null。否则他会向表达式添加一些操作。他尝试了两种“方法”,一种将当前结果乘以 * 3,另一种将当前结果加 +5。它在一棵树上递归(所以每次他都会分叉两次递归调用)。空 || Something == Something,因此找到响应的分支将返回他的响应,另一个分支将返回 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));
请注意,作为一个例子,它非常复杂,因为它使用了闭包(本地定义的函数)。