递归函数的几个例子,汉诺塔,全排列,python编程

递归函数的几个例子,汉诺塔,全排列,python编程

汉诺塔:

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.在递归中还要注意函数的适用性,所以需要把一些参数变量化,不能使用定值。

--------后续还会继续分享一些基本算法,喜欢的话点个赞关注一下,我们一起学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值