用PYTHON学算法DAY3--递归

根据蓝桥云课--算法入门精品课学习笔记打卡day2

一、切蛋糕思维-递归练习题

"""找重复(子问题)
  找重复中的变化量->参数
  找参数变化趋势->设计出口
  省流:找重复、找变化、找出口"""

#第一题:数组求和
#n个元素的子问题,数组长度不断缩短,起点右移终点不变
#return arr[begin]+arrSum(arr);必须引入参数begin,每次循环使i加1
arr=[1,2,3,4,5,6,7,8,9,10]
def arrSum(arr,begin=0):                     #起点不断右移,设置默认起点begin=0
    if begin==len(arr)-1:                    #起点移到了最后直接返回这个起点值即可
        return arr[begin]
    return arr[begin]+arrSum(arr,begin+1)    #调用递归,右移起点
print(arrSum(arr))

print("===============================")
#第二题:字符串翻转后返回
str='asdfghjkl'
def reverseStr(str,begin=len(str)-1):       #翻转的变化是最右向左移,是最右的加上,剩下的翻转
    if begin==0:                            #已经到了最左侧,直接返回即可
        return str[0]
    return str[begin]+reverseStr(str,begin-1)   #就像abcd,'d'+reverseStr(abc)
print(reverseStr(str))

二、斐波拉契数列与求最大公约数

"""重复中寻找变化、变化中寻找重复"""
#1.递归求斐波那契数列
def fib(n):
    if n==1 or n==2:                        #fib(1)=fib(2)=1
    #只能用or不能用|,|是按位或
        return 1
    else:
        return fib(n-1)+fib(n-2)
for i in range(1,11):
    print(fib(i),end=" ")

print("\n==============================")
#2.递归求最大公约数--辗转相除法,即欧几里德算法
def gcd(m,n):
    if(n==0):
        return m
    return gcd(n,m%n)           #记住这个式子即可,证明就使用a=mc,b=nc即可
print(gcd(6,9))

三、插入排序改递归

#插入排序改递归
def insertSort(arr,k):
    if k==0:                                    #排到最左边一个了,直接退出即可
        return
    insertSort(arr,k-1)                         #对前k-1个元素排序,后面就默认前k-1个已经排好了
    x=arr[k]                                    #先保存要插入的k的值
    index=k-1                                   #设置一个索引用于插入
    while(x<arr[index] and index>-1):           #当要插入的值小于索引,则不断左移索引,知道可以正确插入了就不执行了
        arr[index+1]=arr[index]
        index-=1                                #索引一定要左移
    arr[index+1]=x                              #注意次数是index+1,因为上面多-1了
array1=[1,3,5,9,8,2]
insertSort(array1,5)
print(array1)

四、汉诺塔

"""汉诺塔问题:给定三根柱子,记为ABC,其中 A柱子上有n个盘子,
从上到下编号为0到n-1,且上面的盘子一定比下面的盘子小。问:将
A柱上的盘子经由B柱移动到C柱最少需要多少次?
移动时应注意:① 一次只能移动一个盘子
②大的盘子不能压在小盘子上"""
#思路
"""1-N从A移动到B,C作为辅助
等价于:
    1、1~N-1从A移动到C,B为辅助
    2、把N从A移动到B
    3、1-N-1从C移动到B, A为辅助
"""
def printHanoiTower(n,From,to,help):                            #分别对应盘子的个数,A,B,C
    if n==1:                                                    #递归边界
        print("MOVE "+str(n)+" FROM "+From+" TO "+to)           #从第n个盘子从From移动到to
        return
    else:
        printHanoiTower(n-1,From,help,to)                       #1~N-1从A移动到C,B为辅助
        print("MOVE "+str(n)+" FROM "+From+" TO "+to)           #把N从A移动到B
        printHanoiTower(n-1,help,to,From)                       #1-N-1从C移动到B, A为辅助
str1='ABC'                                                      #三个柱子的名字
printHanoiTower(5,str1[0],str1[1],str1[2])                      #5个盘子,三个柱子

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值