重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我觉得你在贴代码的时候应该把缩进加上,或者直接把代码的图片放上,要好理解的多
我们一直强调做网站、成都做网站对于企业的重要性,如果您也觉得重要,那么就需要我们慎重对待,选择一个安全靠谱的网站建设公司,企业网站我们建议是要么不做,要么就做好,让网站能真正成为企业发展过程中的有力推手。专业的建站公司不一定是大公司,创新互联建站作为专业的网络公司选择我们就是放心。
您好:perm函数输出的是参数list从参数k位置开始,到参数m位置结束的全排列
def perm(list,k,m):
if k==m:
for i in range(m+1): # 递归的结束条件是k==m,在整个递归过程中参数m(即结束位置没有改变),而参数k则每次递归+1
print list[i], # 输出递归结束时的list状态
else:
for i in range(k,m+1): # 该循环用来负责生成递归的下一个状态
list[k],list[i]=list[i],list[k] # 将list的k位置与每一个位置i分别交换
perm(list,k+1,m) # 由于k位置与每一个位置i交换,也即k位置所有可能选值都已被穷举,此时只需要继续计算k+1之后的职位即可,因此以k+1为开始位置,结束位置m不变进入下一层递归
list[k],list[i]=list[i],list[k] # 由于list是引用传递,因此需要在位置交换之后重新交换,以保证list不变。
希望我的答复可以帮助你加深理解:
第一,perm函数中的条件for(int
i=k;i=m;i++)应更正为
for(int
i=k;i
#include
int
N,P=0;
void
swap(int
a[],int
i,int
j)
{
int
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
void
perm(int
a[],int
k,int
m,int
pk,int
pm)
{
int
i;
/*k为中间变量,m初始化为参与排列元素的起始坐标和终止坐标
pk,pm分别表示参与排列元素的起始坐标和终止坐标,整个递归过程保持不变*/
if(k==m)
{
printf("-----perm
%d
:\n",P/N+1);/*打印提示*/
for(i=pk;i
Over!\n");/*打印提示*/
system("pause");
return
0;
}
2.打印结果
============================================================
a
0,0,1,2,3
b
0,0,1,2,3
a
1,1,1,2,3
b
1,1,1,2,3
a
2,2,1,2,3
b
2,2,1,2,3
-----perm
1
:
1
2
3
c
2,2,1,2,3
d
2,2,1,2,3
c
1,1,1,2,3
d
1,1,1,2,3
a
2,1,1,2,3
b
2,1,1,3,2
a
2,2,1,3,2
b
2,2,1,3,2
-----perm
2
:
1
3
2
c
2,2,1,3,2
d
2,2,1,3,2
c
2,1,1,3,2
d
2,1,1,2,3
c
0,0,1,2,3
d
0,0,1,2,3
a
1,0,1,2,3
b
1,0,2,1,3
a
1,1,2,1,3
b
1,1,2,1,3
a
2,2,2,1,3
b
2,2,2,1,3
-----perm
3
:
2
1
3
c
2,2,2,1,3
d
2,2,2,1,3
c
1,1,2,1,3
d
1,1,2,1,3
a
2,1,2,1,3
b
2,1,2,3,1
a
2,2,2,3,1
b
2,2,2,3,1
-----perm
4
:
2
3
1
c
2,2,2,3,1
d
2,2,2,3,1
c
2,1,2,3,1
d
2,1,2,1,3
c
1,0,2,1,3
d
1,0,1,2,3
a
2,0,1,2,3
b
2,0,3,2,1
a
1,1,3,2,1
b
1,1,3,2,1
a
2,2,3,2,1
b
2,2,3,2,1
-----perm
5
:
3
2
1
c
2,2,3,2,1
d
2,2,3,2,1
c
1,1,3,2,1
d
1,1,3,2,1
a
2,1,3,2,1
b
2,1,3,1,2
a
2,2,3,1,2
b
2,2,3,1,2
-----perm
6
:
3
1
2
c
2,2,3,1,2
d
2,2,3,1,2
c
2,1,3,1,2
d
2,1,3,2,1
c
2,0,3,2,1
d
2,0,1,2,3
-----Over!
请按任意键继续.
.
.
我不明白的是,为什么会只能处理10个以下的x。虽然python有1000次的递归次数上限,但你的问题所需要的递归次数是由x的个数决定的,应该还远没有达到递归上限。所以,只能认为你的写法是错误的。
def f(string):
if 'x' in string:
strlist = string.split()
strtmp = ''
for i in range(len(strlist)):
strtmp += strlist[i].replace('x', '0', 1)
strtmp += ' '
strtmp += strlist[i].replace('x', '1', 1)
strtmp += ' '
return f(strtmp.strip())
else:
return string
a = 'xxxxxxxxxxx'
print f(a)
Python实现的排列组合计算操作示例
本文实例讲述了Python实现的排列组合计算操作。分享给大家供大家参考,具体如下:
1. 调用 scipy 计算排列组合的具体数值
from scipy.special import comb, perm
perm(3, 2)
6.0
comb(3, 2)
3.0
2. 调用 itertools 获取排列组合的全部情况数
from itertools import combinations, permutations
permutations([1, 2, 3], 2)
itertools.permutations at 0x7febfd880fc0
# 可迭代对象
list(permutations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
list(combinations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 3)]
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()的字串、列表等参数进行全排列 并返回全排列后的列表
#递归不是人的思考方式…