汉诺塔:
def hnt(n,s='A',d='C'): #默认是从A移到C 具体可以自己设置
pillar=['A','B','C']
empty='' #找出空闲位置
for i in pillar:
if i != s and i!= d:
empty=i
if n == 2:
print("%s->%s"%(s,empty))
print("%s->%s"%(s,d))
print("%s->%s"% (empty,d))
else:
hnt(n-1,s,empty) #子项目
print("%s->%s"%(s,d)) #子项目
hnt(n-1,empty,d) #子项目
说明:每次只移动柱子中最上面的一个圆盘。这里的s变量指的是源柱子(source),d指的是目标柱子(destination)
解析:这里我们把整个任务分成三个子项目:
1.把上面n-1个圆盘先移动到空闲柱子上。
2.把源柱子s中最底下的圆盘移到目标柱子d
3.把空闲柱子上的所有圆盘移到目标柱子d上
经验:在做递归的时候不仅仅要想好终止条件,还要做好子任务的细分步骤。
全排列的倒序输出
def PERMUTATIONS2(m,n=0,flag=1,P=[]): #这里的flag作为一个开关,仅在第一次时有效,对数组初始化
if flag ==1:
n=m
for j in range(0, n):
P.append(0)
if m == 0:
print(P)
else:
for j in range(n-1, -1,-1): #这一段是用来找出空位并赋值
if P[j] == 0:
P[j] = m
PERMUTATIONS2(m - 1,n,0)
P[j] = 0
思路:数组 a=[1,2,3…,n],以n为基准,依次放在0,1,2…n-1的位置(因为这里是倒序的,所以位置从n-1倒着来)其他位置的数置零,其他位置当检测到为0的时候填入本趟主数m,注意每次填完后返回要置零,以便下次赋值。具体流程需要自己debug操作深入理解,这个算法确实精髓。
总结:
1,想要在调用一个递归中少输入参数,可以考虑默认参数加开关(flag)的办法,这样就可以在第一次的时候设定一些初始值而后面的调用隐藏初始值的赋值。
2.在递归中还要注意函数的适用性,所以需要把一些参数变量化,不能使用定值。
--------后续还会继续分享一些基本算法,喜欢的话点个赞关注一下,我们一起学习!