Javascript中的组合算法返回一个数字的所有可能组成

时间:2011-12-04 12:57:18

标签: javascript algorithm combinatorics

修改

我需要在Javascript中实现组合算法,其结果与the figure on the right in Wikipedia相同。使用给定的数字(n),该函数将能够返回所有可能的分色,例如

2: [1,1], [2] (2 sets)
3: [1,1,1], [1,2], [2,1], [3] (4 sets)
4: [1,1,1,1], [1,1,2], [1,2,1], [2,1,1], [2,2], [3,1], [1,3], [4] (8 sets)

理想情况下,它应该是一个函数接受并执行回调2^(n-1)次。我将接受我能理解的任何语言的答案(并从中重写)。谢谢!

3 个答案:

答案 0 :(得分:3)

Prusswan可能已经给出了最佳答案(算法的名称),但我无法抗拒写一些javascript:

function separate(n, callback) {
    for (var i=1; i<n; i++) {
        separate(n-i, function(ret) {
            ret.push(i);
            callback(ret);
        });
    }
    callback([n]);
}

答案 1 :(得分:1)

我自己完成了这个功能:

/* Return all possibile compositions of a given natural number
* callback will be called 2^n-1 times.
*
* ref: http://en.wikipedia.org/wiki/Composition_(number_theory)
*/

function compositionsOf(n, callback) {
    var x, a, j;
    x = 1 << n-1;
    while (x--) {
        a = [1];
        j = 0;
        while (n-1 > j) {
            if (x & (1 << j)) {
                a[a.length-1]++;
            } else {
                a.push(1);
            }
            j++;
        }
        callback.call(this, a);
    }
};

答案 2 :(得分:1)

def partition(i):
    lst = [1]
    while i:
        if i & 1:
            lst.append(1)
        else:
            lst[-1] += 1
        i >>= 1
    del lst[-1]
    return lst

呼叫2 **(n-1)&lt; = i&lt; 2 ** N