以上四种情况均为最常见的排列组合,从有无顺序和是否重复两个维度进行思考,建议理解并背诵.
在使用python计算排列组合之前,需要计算阶乘,可以有两种方式,一是使用math库中的factorial函数,二是使用如下的递归函数.
按照排列的公式:
按照组合的公式:
此题属于全排列问题,需要反向思考,写出公式之后直接输入到python中计算
此题属于组合问题,中奖的可能性为一种,所以呢分子为1,分母为所有的组合情况.
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列.
示例 1:
输出:
源码:
运行结果:
def?p(s,res=[]):
#将字符c插入到数列ar中,会有多少种排列
def?h(c,ar):
return?[ar[:i]+[c]+ar[i:]?for?i?in?range(len(ar)+1)]
#已有结果arr的基础上,如果增加c字符,arr会变成多少种排列
def?g(c,arr,res=[]):
if?arr==res==[]:
return?[[c]]
elif?arr==[]:
return?res
else:
return?g(c,arr[1:],res+h(c,arr[0]))
#主体递归
if?s=='':
return?p(s[1:],g(s[0],res))
if?__name__=='__main__':
s='ABCDE'
for?x?in?p(s):
print(''.join(x))
难度:★★★☆☆
类型:数学
方法:回溯法
给定一个没有重复数字的序列,返回其所有可能的全排列.
输出:
[
]
这里需要注意的是,每次交换元素并回溯寻找后,都要将元素交换回来,保持没有交换前的状态.
与回溯法类似,增加临时列表用来存储是否查看过变量.
如有疑问或建议,欢迎评论区留言~
def?perm(l):
#定义自定义函数?函数名为perm?参数为l?当传入参数时?l等于该参数
if(len(l)=1):?
#if语句如果传入的参数l的长度小于等于1(也就是0)则运行下面代码?否则跳过该if#?#语句
return?[l]
#返回列表[l]?此处为递归的终止?
r=[]
#定义列表?并初始化r?
for?i?in?range(len(l)):?
#for循环(c语言常这么说)?迭代?i的变化范围为0?到l(字母L)的长度-1
s=l[:i]+l[i+1:]
#?将l的前三项以及l的第i+1后的字串赋给s
p=perm(s)?
#递归?将s做perm的处理?递归请百度
for?x?in?p:
#迭代p列表?
r.append(l[i:i+1]+x)?
#将l的第i项添加进r列表?
return?r
#返回r列表
函数功能:将传入perm()的字串、列表等参数进行全排列 并返回全排列后的列表
#递归不是人的思考方式...