我正在尝试制作一个Javascript函数,该函数将返回给定数组中的手镯组合,但我不确定如何解决问题 - 看起来很难......
基本上,我希望函数接收一些多维数组[[1,1],[2,2],[3,3],[4,4]]并返回所有非重复排列,但有一些例外:
手镯组合的最佳传统中的一切。
我找到了一些JS函数,它有一些原型:
function bracelets(n, k) {
var a = [],
i = -1;
while (++i < n) a[i] = 0;
return genb(1, 1, 1, -1, 0, false);
function genb(t, p, r, u, v, rs) {
var result = [];
if (t - 1 > (n - r) / 2 + r) {
if (a[t - 1] > a[n - t + 2 + r]) rs = false;
else if (a[t - 1] < a[n - t + 2 + r]) rs = true;
}
if (t > n) {
if (!rs && n % p === 0) result.push(a.slice(1));
} else {
a[t] = a[t - p];
v = a[t] === a[1] ? v + 1 : 0;
if (u === -1 && a[t - 1] !== a[1]) u = r = t - 2;
if (u === -1 || t !== n || a[n] !== a[1]) {
if (u === v) {
var rev = checkrev(t, u);
if (rev !== -1) result = result.concat(genb(t + 1, p, rev ? t : r, u, v, rev ? false : rs));
} else result = result.concat(genb(t + 1, p, r, u, v, rs));
}
for (var j = a[t - p] + 1; j < k; j++) {
a[t] = j;
result = result.concat(genb(t + 1, t , r, u, 0, rs));
}
}
return result;
}
function checkrev(t, i) {
while (++i < (t + 1) / 2 + 1) {
if (a[i] < a[t - i + 1]) return 0;
if (a[i] > a[t - i + 1]) return -1;
}
return 1;
}
}
然而它非常难以理解,并且没有注释。另外,我不能说它以我需要的方式使用数组,也没有给出一个独特的集合。
我宁愿说我不完全理解项链/手链组合的数学概念如何应用于编程,因此我的问题是如何使用应用编程制作手链组合。另外,既然我知道JS足够了解这样一个复杂的算法,那么在JS中给我一些简化的例子或者如果它更容易解释上面的代码将会非常有用。
此外,这个函数可以表示为迭代而不是递归吗?
参考(抱歉不能以适当的格式提供更多的链接):
Necklace > Bracelets combinations (quick and easy)
(更多数学公式:theory.cs.uvic.ca/inf/neck/NecklaceInfo.html)
(完整说明:teaching.csse.uwa.edu.au/units/CITS7209/polya.pdf)