求全排列,在用非递归的方法的时候,最烦人的一点就是缩进,特别是在数多的时候,今天在做搭积木的题的时候就是,当时没跑出来,我还以为是方法的问题,试了好多次,还是不行,最后才发现原来是缩进的错误。
下面展示出题目和方法
题目:
搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
下面贴上代码:(非递归)
lit=[0,1,2,3,4,5,6,7,8,9]
sum=0
for a in lit:
for b in lit:
if a==b:
continue
for c in lit:
if c in [a,b]:
continue
if (a>b and a>c):
continue
for d in lit:
if d in [a,b,c]:
continue
for e in lit:
if e in [a,b,c,d]:
continue
if (b>d and b>e):
continue
for f in lit:
if f in [a,b,c,d,e]:
continue
if (c>e and c>f):
continue
for g in lit:
if g in [a,b,c,d,e,f]:
continue
for h in lit:
if h in [a,b,c,d,e,f,g]:
continue
if (d>g and d>h):
continue
for i in lit:
if i in [a,b,c,d,e,f,g,h]:
continue
if (e>h and e>i):
continue
for j in lit:
if j in [a,b,c,d,e,f,g,h,i]:
continue
if (f>i and f>j):
continue
sum=sum+1
print(sum)
结果:
768
递归:
def permutation(lst):
if len(lst)==0 or len(lst)==1:
return [lst]
result=[]
for i in lst:
temp_list=lst[:]
temp_list.remove(i)
temp=permutation(temp_list)
for j in temp:
j.insert(0,i)
result.append(j)
return result
if __name__=="__main__":
lst=[0,1,2,3,4,5,6,7,8,9]
sum = 0
temp_result=permutation(lst)
for lit2 in temp_result:
if lit2[0]<lit2[1] and lit2[0]<lit2[2] and lit2[1]<lit2[3] and lit2[1]<lit2[4] and lit2[2]<lit2[4] and lit2[2]<lit2[5] and lit2[3]<lit2[6] and lit2[3]<lit2[7] and lit2[4]<lit2[7] and lit2[4]<lit2[8] and lit2[5]<lit2[8] and lit2[5]<lit2[9]:
sum=sum+1
print(sum)
结果都是一样的,在这里有一个很低级的错误值的大家学习,就是在数比较多的情况,一定要注意缩进,有时候在这种情况又不会报错,但又不会出结果,贼烦人,还浪费时间。
这只是本人的一些方法,如有错误或者更好的方法还请多多指教!