对于列表=[1,2,3,4,5,6,…] 从中间随机选x个数字组合求出所有组合
算法描述:
我们对于每一个数都有两种情况选和不选。
递归结束条件:
1.当已经选择的数字有x个的时候输出
2.当代码执行到最后一个元素的时候程序结束。
首先我们先来看一个问题方便之后我们确认所求的组合数对不对。
怎么求组合数C(N,K)【从N个数中选取K个数的个数】
公式1:C(N,K)*(N-K+1)/K
公式2:C(N,K)=C(N-1,K)+C(N-1,K-1)
公式解释:
对于公式1:展开后显然
对于公式2:
对于数的集合{a1,a2,a3,a4,a5,a6,…}
对于ak都有两种情况选和不选
1>选: 那么从剩下的N-1个数再选K-1个即:C(N-1,K-1)
2>不选:那么还要从剩下的N-1个数再选K个数即:C(N-1,K)
python代码实现:
def Combination_Method_One(ALL,CHOSE):
if CHOSE==0 :
return 1
else:
return Combination_Method_One(ALL,CHOSE-1)*(ALL-CHOSE+1)/CHOSE
def Combination_Method_Tow(ALL,CHOSE):
if ALL==CHOSE or CHOSE==0:
return 1
elif CHOSE==1:
return ALL
else:
return Combination_Method_Tow(ALL-1,CHOSE)+Combination_Method_Tow(ALL-1,CHOSE-1)
def main():
print(int(Combination_Method_One(10,3)))
print(Combination_Method_Tow(10,3))
main()
#Output:
"""15
15
"""
由上面我们可以计算出组合数的结果,我们再回到第一个问题怎么输出组合后的数
python代码实现:
Number_List=[1,2,3,4,5,6]
Need_Chosen=2
Count=0
def Combination_Method_Tow(ALL,CHOSE):#得到组合数的结果用上面的函数求
if ALL==CHOSE or CHOSE==0:#
return 1
elif CHOSE==1:
return ALL
else:
return Combination_Method_Tow(ALL-1,CHOSE)+Combination_Method_Tow(ALL-1,CHOSE-1)
def Number_Combination(Position=0,Have_Get=[]):
global Number_List #声明全局变量
global Need_Chosen #声明全局变量
global Count #声明全局变量
if len(Have_Get)==Need_Chosen:#当个数满足的时候输出
Count+=1#组合数的个数+1
print(tuple(Have_Get))#输出组合
elif Position==len(Number_List):#当函数来到列表最后一个数的时候不能到下一个了所以要返回
return 0
else:
Have_Get.append(Number_List[Position])#选这个数
Number_Combination(Position+1,Have_In+1,Have_Get)#选的时候的递归
del Have_Get[len(Have_Get)-1]#不选这个数则需要把刚刚加进来的删除
Number_Combination(Position+1,Have_Get)#不选的时候递归
def main():
Number_Combination()
print(Count,end=' ')
print(Combination_Method_Tow(len(Number_List),Need_Chosen))
main()
#Output:
"""(1, 2)
(1, 3)
(1, 4)
(1, 5)
(1, 6)
(2, 3)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)
(4, 5)
(4, 6)
(5, 6)
15 15
"""
如果没有学过python上述代码可以当做伪代码来看
可能许多程序爱好者第一个学的语言是C/C++作者在这里给出C/C++代码实现:
#include
#include
using namespace std;
int Length=7;
int Number_List[10]={1,2,3,4,5,6};int Need_Chosen=2;int Count=0;int Combination_Count(int N,int K){
if(K==1)
return N;
else if(N==K||K==0)
return 1;
else
return Combination_Count(N-1,K-1)+Combination_Count(N-1,K);
}int Combination_ALL(int Position,int Have_In,list Have_Get){
if(Position==Length)
return 0;
else if(Need_Chosen==Have_In){
cout<<"( "; for(list::iterator IT=Have_Get.begin();IT!=Have_Get.end();IT++)
cout<<*IT<<" "; cout<<")"<
}else{
Have_Get.push_back(Number_List[Position]);
Combination_ALL(Position+1,Have_In+1,Have_Get);
Have_Get.pop_back();
Combination_ALL(Position+1,Have_In,Have_Get);
}
}int main(){
list Have_Get;
Combination_ALL(0,0,Have_Get);
cout<
cout<
return 0;
}
END...