自写排列算法:
例:前三个数的全排列(从小到大)
def dfs(s,t):
if s==t: #递归结束,输出一个全排列
print(b[0:n])
else:
for i in range(t):
if vis[i]==False:
vis[i]=True
b[s]=a[i] #存排列
dfs(s+1,t)
vis[i]=False
a=[1,2,3,4,5,6,7,8,9]
b=[0]*10 #记录生成的一个全排列
vis=[False]*10 #记录第 i 个数是否用过
n=3
dfs(0,n) #前 n 个数的全排列
1 2 3 4 5 的全排列,第1个空格有5种填充方法,相当于第一个数和后面的5-1个数分别做了一次交换。
那么第一个空格的所有情况已经求出来了,同理,在第1个空格的基础上,第2个空格有n-1种填充方法,相当于第2个数和后面的5-2个数分别做了一次交换。所以我们可以先把以1开头的全排列情况全部求出来,再求以2、3、4、5的,在以1开头的前提下,我们再以2开头,层层递归下去,值得注意的是,交换以后我们需要再交换回来;
有3个盒子 1、2、3,3张扑克牌 1、2、3,进行扑克牌全排列可以这样实现:
不管面对哪个盒子,都尝试按“1--n”的顺序将扑克牌放入,如果第m张扑克牌已经用过,判断第m+1张是否可用。
当放满n个盒子时,回头,把盒子里面的牌捡回来,再继续按顺序放牌进盒子。
过程:
第1个盒子:放入1号牌
第2个盒子:本来应该放入1号牌,但是由于1号牌已用,只能按顺序放入2号牌
自编排列组合算法实现

文章介绍了如何使用深度优先搜索(DFS)算法实现全排列和组合的计算。通过递归方式,分别展示了计算指定数量数字的全排列以及二进制数的生成。对于全排列问题,算法基于对每个位置尝试所有可能的数字,同时跟踪已使用的数字以避免重复。在组合问题中,算法选择一定数量的元素并打印它们的组合。
最低0.47元/天 解锁文章
975





