汉诺塔游戏求解||递归算法一||python

本文详细介绍了Python编程中的递归算法应用,包括计算阶乘、打印指定范围数字、数组求和、字符串翻转、斐波那契数列、最大公约数、插入排序、汉诺塔游戏和二分查找等经典问题的递归解决方案,旨在提升对递归理解与应用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@python递归算法----灵活使用
1.阶乘
2.打印i~j
3.数组求和
4.翻转字串
5.多分支递归
6.最大公约数
7.插入排序改递归
8.汉诺塔游戏
9.二分法查找(递归解法)

#递归,从简单的开始
#一.求n的阶乘
'''
1.找重复:n(n-1)的阶乘,求n-1的阶乘时原问题的重复(规模更小)——子问题
2.找变化:变化量作为参数
3.找边界:出口
'''
def jiecheng(n):
    if n==1:
        return 1
    res=0
    res+=n*jiecheng(n-1)
    return res
#二、打印i~j
'''
1.找重复:
2.找变化:变化量作为参数
3.找边界:出口
'''
def print_IJ(i,j):
    if i>j: #边界
        return j
    print(i)
    return print_IJ(i+1,j)

#三、数组求和
def add_Array(arr,i):
    if i==len(arr)-1:
        return arr[i]
    return arr[i]+add_Array(arr,i+1)

#四、翻转字串
def Rever_char(s,i):
    if i==0:
        return s[i]
    return s[i]+Rever_char(s,i-1)

#五、多分支递归:
# 斐波拉契数列
def feiqi(N):
    if N<=2:
        return 1
    return feiqi(N-1)+feiqi(N-2)
#六、最大公约数(辗转相除法和math.gcd())一样的
def GCD(a,b):
    if a%b==0:
        return b
    return GCD(b,a%b)

#七、插入排序改递归
'''
对数组排序,等价于对数组的部分排序
等价于对数组的第二个元素,这部分排序
然后把最后一个元素插入到这个有序的部分中
'''
def chapai(data,i):
    if i==0:
        return
    chapai(data,i-1)#首先对i-1个元素排序
    x=data[i]#把位置i的元素插入到前面的部分去
    index=i-1
    while index>-1 and x<data[index]:
        data[index+1]=data[index]
        index-=1
    data[index+1]=x
    return data

#八、汉诺塔游戏:将1—N从A移动到B,C为辅助
'''
等价于:
1.1-N-1移动到C,A作为原,B为辅助
2.把N从A移动到B
3.1-N从C移动到B,A为辅助
就是每次把除了最大的小盘子移动到辅助盘上。
'''
def HannuoTa(N,FF,TTo,HHELP):#对朔源的程序编写有一定的帮助
    if N==1: #边界,最上面的一个盘子
        print('move  '+str(N)+'  from  '+FF+'  to  '+TTo)
        AA.append('move  '+str(N)+'  from  '+FF+'  to  '+TTo)
    else:
        HannuoTa(N-1,FF,HHELP,TTo)
        print('move  '+str(N)+'  from  '+FF+'  to  '+TTo)
        AA.append('move  '+str(N)+'  from  '+FF+'  to  '+TTo)
        HannuoTa(N-1,HHELP,TTo,FF)

#九、两个到多个子问题只选其一的情况:二分查找递归解法
'''
等价于三个子问题:左边找(递归的),中间找,右边找(递归)
注意:左边查找和右边查找只选其一
'''
def erfen(list_d,low,high,key):
    if low>high:
        return -1
    mid=low+(high-low)//2-1#减1是为了避免溢出
    midval=list_d[mid]
    if midval<key:
        return erfen(list_d,mid+1,high,key)
    elif midval>key:
        return erfen(list_d,low,mid+1,key)
    else:
        return mid,midval#返回数列下标和数列值

if __name__=='__main__':
    # print(jiecheng(10))
    # print_IJ(1,10)
    # print(add_Array([1,5,8],1))
    # print(Rever_char('abcd',3))
    # print(feiqi(7))
    # print(GCD(27,57))
    # print(chapai([1,5,2,3,4,7,18,10],7))
    AA = []#保存路径
    # HannuoTa(3,'A','B','C')
    # print(len(AA))#打印转换的次数
    print(erfen([1,2,3,4,5,6,7],0,6,2))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值