目录
递归算法
1.进制数转换
2.阶乘递归
3.递归获取两个数之间最小公倍数
4.递归获取两个数字之间最大公约数
5.斐波那契数列
5.递归求得数列的最值
6.倒序输出
7.递归二分法查找
递归算法
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
也就是一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
在学习C语言的时候,我们学过函数的递归,同样在Python中也有递归函数,这一节我就以习题的形式去讲解递归函数,思路基本上是一样的。
1.进制数转换
输入一个十进制数,用递归来输出转换后的二进制数
#递归进制数转换
def fun(n):
if n:
fun(int(n/2))
print(n%2,end='')
else:
return
a=int(input(''))
fun(a)
基本思路就是对这个十进制数对2求余,然后除2去整,直到这个数字变为0,那就基本转换完成了
2.阶乘递归
输入一个整数,通过递归输出这个整数的阶乘
#递归阶乘
def kun(n):
if n==0:
return 1
return kun(n-1)*n
m=int(input(''))
这个没什么好说的,基本做到烂
3.递归获取两个数之间最小公倍数
输入两个整数,输出这两个整数的最小公倍数
def fu(a,b,i=1):
if i*a%b:
i=i+1
return fu(a,b,i)
return a*i
x=int(input('num1:'))
y=int(input('num2:'))
print(fu(x,y))
这里就需要用到一个默认参数i,通过对i每次递归进行+1,直到a*i能够被b整除(求余为0),此时a*i就是最小公倍数了
4.递归获取两个数字之间最大公约数
输入两个数字a,b,输出这两个数字之间的最大公约数
#递归公约数
def ff(a,b):
c=int(a%b)
a=b
b=c
if b==0:
return a
return ff(a,b)
x=int(input('num1:'))
y=int(input('num2:'))
print(ff(x,y))
这个就直接利用辗转求余法,每次递归会获取a%b的值,然后依次进行a=b,b=c的赋值,直到被除数b为0,就结束,此时的a就是最大公约数
5.斐波那契数列
输入一个整数n,输出第n个斐波那契数的值
#递归斐波那契数列
def fuc(n,a=1,b=1):
n = n - 1
if n == 0:
return a
c=a+b
a=b
b=c
return fuc(n,a,b)
x=int(input('你想要第几个斐波那契数:'))
print(fuc(x))
斐波那契数列问题已经是屡见不鲜了,就不多说了
5.递归求得数列的最值
输入一组数字(存放到列表中),直到输入-1表示结束输入,输出这组数字中的最大值
示例:输入[1,5,8,9,4,6,22,5,6]
输出:最大值为22
#递归列表最值
def fmax(li,n=0,max=0):
if li[n]>=max:
max=li[n]
if n<len(li)-1:
n+=1
return fmax(li,n,max)
else:
return max
li=[]
while 1:
a=int(input(''))
if a==-1:#如果输入-1就表示结束,而且-1不纳入列表当中
print(li)
print('最大值为',fmax(li))
break
li.append(a)
这个输出最大值、最小值问题一般会先去初始化max=0,然后去把列表当中第一个数值赋给max,然后依次去跟li第二个、第三个数字进行比较,如果当第n个数字大于max时2,max就赋值为li[n]
6.倒序输出
输入一个字符串,然后倒序输出
#递归倒序输出(字符串)
def fyou(s,n=0):
if n>=len(s):
return
fyou(s,n+1)
print(s[n],end='')
st=input('输入字符串:')
fyou(st)
注意规则:先递归再输出,当递归到return的时候就把前面的内容全部输出来,所以输出的结果是最后一个字符开始,依次往前输出
7.递归二分法查找
输入一组数字(按照大小顺序输入放到列表当中),然后再次输入想要查找的数字,最后在这个数字列表输出这个数字的位置,如果找不到就返回-1
#递归二分法查找
def find(li,key,left,right):
mid=int((left+right)/2)
while left<right:
if key>li[mid]:
left=mid+1
find(li,key,left,right)
elif key<li[mid]:
right=mid-1
find(li, key, left, right)
else:
return mid #找到了就返回mid,也就是此时的位置
return -1#找不到就返回-1
li=[]
while 1:
a=int(input(''))
if a==0: #如果输入0就表示结束输入
key=int(input('输入你想要查找的数字:'))
print(find(li,key,0,len(li)-1))
break
li.append(a)
递归二分法查找也就是在一组已排好序的数组当中去查找你想要的数字所在的位置,实际上是通过比较大小去查找的,先获取这个数组的中位数大小,然后跟要查找的数字进行大小比较,如果要查找的数字key大于中位数那么就把查找范围转移到右半部分,如果小于的话就把查找范围转移到左半部分,以此类推,直到找到这个数字为止,最后返回mid,也就是这个数字的所在位置
这里我就讲这么多了,对于递归函数其实也没什么特别的,无非就是自己调用自己,直达满足一定的添加之后 就结束递归,然后就返回相应的结果,多看看一些题就会了的 ,今天就先讲这么多了,thanks~~~
分享一张壁纸~