两两组合有多少种组合方式,求代码

can_fly_fish
  • 142
4,6,7,8,9,10几个数字两两组合,有多少种组合方式,颠倒位置不算,求代码
回复
阅读 7.5k
9 个回答

方便理解就是n-1 + n-2 + ...+ 2+1
组合就是cn2 最后就过就是(n-1)*n/2
高中知识吧

更新:
后来的答案全是C(6,2),这是不正确的。 在这里要求是两两组合而非62,答案应该是C(6,2)*C(4,2)*C(2,2)/A(3,3),虽然结果和C(6,2)结果一样都是15
后来的回答只有小明的是正确的

n个数,取出两个数
c(n)=n!/2(n-2)!
阶乘函数
const f = n =>n==1?1:n*g(n-1)
所以,组合数:
const c = n =>f(n)/f(n-2)/2
在这个问题里,
const g = n =>c(6)*c(4)*c(2)/f(3)
g()//15

经典算法:穷举+去重。
允许输入的数字有重复,如(4,4,5,6,7,8,9,9)

var input = [4,6,7,8,9,10];

function foo(arr) {
    var i, j, comb,
        len=arr.length,
        list = [];

    for (i=0; i<len; i++){
        for (j=0; j<len; j++){
            if (j !== i) {
                comb = [arr[i], arr[j]].sort(function(a,b){return a-b}).join(",");
                if (list.indexOf(comb) < 0) {
                    list.push(comb);
                }
            }
        }
    }
    return list.length;
}

foo(input);

用代码有点大材小用吧,真要用的话深度优先搜索?

...这不是数学吗... c(6,2)

精简版

    count = 0
    nums = [4,6,7,8,9,10]
    nums2 = list(nums)
    for x in nums:
        del nums2[0]
        for y in nums2:
            print("(%d,%d)"%(x,y))
            count+=1 
    print(count) //C(6,2)=15

首先对给出的数组 去重(因为问的是组合方式)
然后根据排列组合的公式 cn2 计算出结果
最后 加上 有重复数字的个数(因为 1 2 2 会存在 1 2 和 2 2 两种组合方式,一定要记得统计上)

    var data = [4,6,7,8,9,10];
    var result = [];
    
    function fun(arr,startIndex){
        for(var i = startIndex ; i < arr.length && (i + 1) < arr.length; i ++){
            result.push([arr[startIndex],arr[i+1]]);
        }
        if(startIndex < arr.length)
            fun(arr,startIndex + 1);
        
    }
    fun(data,0);
    
    console.log(result,result.length);
你知道吗?

宣传栏