【问题标题】:find nCr combinations for array items查找数组项的 nCr 组合
【发布时间】:2011-06-16 01:21:43
【问题描述】:

我的递归函数在 Array 中查找 nCr 对象时遇到问题。
这仅在r=2 时有效,意味着仅在进入 1 级时。

r > 2 时,我的临时'a' 数组似乎全部搞砸了

// find nCr combinations in Array
// n -> keys.length
// r -> number of combination to extract (cross = r-1 )

console.clear();
var keys = [0,1,2,3,4,5];

// cross = 'r'-1, s = start point, a = array
function recursive(cross, s, a){
    for( var i=s; i < keys.length; i++ ){
        if( !cross ){
            var b = a.slice(0);
            b.push( keys[i] );
            set.push( b );
        }
        else{ 
            a.splice(-1, 1);
            a.push(keys[i]); 
            recursive(cross-1, i+1, a); 
        }
    }
}

var set = [];
recursive(1, 0, []);
console.log( set );

【问题讨论】:

    标签: javascript math


    【解决方案1】:

    我不确定您在 else 条件下到底要做什么:请注意,a.splice(-1,1) 删除了 a 的最后一个元素,但您从 a 开始是空的,当时什么都没有即将被删除。即使代码适用于r=2,这也表明您做错了。 (事实上​​,每深入一层,a 开始时的元素数量与上一层相同,因此您删除了一些不应该接触的元素。)

    这里对您的算法进行了非常轻微的修改,可以正常工作。我只是更改了else 条件中的语句顺序。

    var keys = [0,1,2,3,4,5];
    
    function recursive(cross, s, a) {
        for( var i=s; i < keys.length; i++ ){
            if( !cross ){
                var b = a.slice(0);
                b.push( keys[i] );
                set.push( b );
            }
            else{ 
                a.push(keys[i]); 
                recursive(cross-1, i+1, a); 
                a.splice(-1, 1);
            }
        }
    }
    
    var set = [];
    recursive(4, 0, []);
    console.log( set );
    

    最后一部分应该打印出keys中的所有(6个选择5)=6个5个元素的组合。

    这个想法是,现在在函数的每次调用中,splice 只删除在该调用中添加的元素,而不是在其他函数调用中可能在其他级别添加的元素。这也保证了a 在结尾处与开头处保持相同。 (您添加的所有内容都会再次删除。)

    这是您在编写递归函数时会看到的一种常见模式:进行一些修改,递归调用函数,然后进行一些清理以反转修改。

    顺便说一句,更简洁的代码(没有cross = r-1 混淆)位于the first revision of this answer

    【讨论】:

    • @vsync:别这样。递归(和二分查找)是出了名的难搞定。即使是有经验的程序员也只有非常小心才能做到。
    • 感谢您抽出宝贵时间,先生。非常感谢并且肯定会帮助其他可能遇到需要这种东西的人。竖起大拇指!
    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    相关资源
    最近更新 更多