4,6,7,8,9,10几个数字两两组合,有多少种组合方式,颠倒位置不算,求代码
更新:
后来的答案全是C(6,2)
,这是不正确的。 在这里要求是两两组合而非6
取2
,答案应该是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);
精简版
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);
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
方便理解就是n-1 + n-2 + ...+ 2+1
组合就是cn2 最后就过就是(n-1)*n/2
高中知识吧