@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))