python数字组合算法_组合数算法递归C/C++和python实现

对于列表=[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...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值