首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找数组项的nCr组合

查找数组项的nCr组合
EN

Stack Overflow用户
提问于 2011-06-15 14:29:45
回答 1查看 2.7K关注 0票数 2

在数组中查找nCr对象的递归函数有问题。

这只在r=2时起作用,意味着只有在内部达到1级时才能起作用。

我的临时'a'数组似乎在r > 2的时候搞砸了

代码语言:javascript
复制
// 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 );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-15 17:06:45

我不知道您在else条件下到底要做什么:注意,a.splice(-1,1)删除了a的最后一个元素,但是在没有要删除的情况下,从a空开始。即使代码适用于r=2,这也表明您正在做一些错误的事情。(实际上,每次您深入一个级别时,a的开头元素数与前一个级别相同,因此您要删除一些不应该触及的元素。)

下面是对您的算法的一个非常小的修改,它正确地工作。我只是更改了else条件中语句的顺序。

代码语言:javascript
复制
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中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6359344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档