【发布时间】:2017-03-28 16:32:32
【问题描述】:
所以,我正在学习递归,并且正在处理一个需要数组中元素的所有变体的编码挑战。
我被指向Heap's algorithm,这就是我到目前为止在 JavaScript 中制定的内容。
function generate(n, array) {
if (n == 1) {
return array;
}
else {
for (var i = 0; i < n - 1; i++) {
generate(n - 1, array);
if (n % 2 == 0) {
swap(array[i], array[n - 1]);
}
else {
swap(array[0], array[n - 1]);
}
}
generate(n - 1, array);
}
}
请忽略我没有将“交换”实例翻译成 JavaScript 的事实。
我有点不确定如何准确地遍历该算法的递归部分。
假设我有数组:[A,B,C,D,E]。我相信我将传递给外部函数的参数是:
generate(5, [A,B,C,D,E]);
在这种情况下,n 不等于 1,所以我将继续讨论“else”部分。 我遇到了 for 循环,因为 n 是 5,所以它会执行。
接下来:函数调用自己,但这次的参数是:
generate(4, [A,B,C,D,E]);
我的困惑从这里开始:
当我经历这个过程时,我是否继续讨论“if”/“else”条件 还是我(在递归调用之后)回到外部函数的最开始?
更新
以下是 Heap 算法的完全翻译的 JavaScript 版本。
function generate(n, array) {
//console.log("ENTER", n, array)
if (n == 1) {
console.log(array);
}
else {
for (var i = 0; i < n - 1; i++) {
//console.log("RECUR", n-1, array)
generate(n - 1, array);
if (n % 2 == 0) {
//console.log("SWAP ", n, array)
var one = array[i];
var two = array[n - 1];
array[i] = two;
array[n - 1] = one;
//swap(array[i], array[n - 1]);
}
else {
//console.log("SWAP ", 0, n-1)
var first = array[0];
var second = array[n - 1];
array[0] = second;
array[n - 1] = first;
//swap(array[0], array[n - 1]);
}
//console.log("array", array)
}
//console.log("RECUR 2", n-1, array)
generate(n - 1, array);
}
//console.log("LEAVE", n, array)
}
我在纸上遍历它,直到我再次重复 [A,B,C,D]。
认为我搞砸了,我决定实施 Prune 的控制台输出建议,看看控制台中发生了什么,这很有帮助。
修复了一个小错误后,现在可以正常工作了。
感谢所有提供帮助的人!
【问题讨论】:
-
当你调用的函数返回一个值时,你继续前进,你不会从头开始。
-
@vic3685 - 我猜我将无法继续执行 for 循环中的“if”语句,直到 generate(n - 1, array) 为:generate (2 - 1, array),因为那是它会返回一些东西 (1)....
标签: javascript algorithm recursion heaps-algorithm