根据蓝桥云课--算法入门精品课学习笔记打卡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个盘子,三个柱子