Python函数之递归
主要内容:递归知识、递归实例、总结三部分
一.递归知识
递归函数就是函数自己内部调用自己。注意两个知识点:
-
递归:定义函数时候,函数本身自己内部调用自己。
-
嵌套:定义函数时候,函数内部重新定义新函数。
注意:1、超过最大递归限制的报错,只要写递归函数,必须要有结束条件
2、返回值,不要只看到return就认为已经返回了。要看返回操作是在递归到第 几层的时候发生的,然后返回给了谁。如果不是返回给最外层函数,调用者就接收不到。需要再分析,看如何把结果返回回来。
二.递归实例
-
二分法查找
通过二分法查找列表中某一个数(二分法必须处理有序列表)
思路:
(1)、二分法原理:取数据中间值,中间值与目标值对比,若大于则往前继续二分查找,若小于则往后查找,直至找到所给的值,跟踩雷游戏一样(不知道踩雷游戏请忽略…咯咯),如从下列表中查找55的索引值,该如何实现?
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
-
def find(l,aim,start = 0,end = None): #定义一个递归函数,
-
end = len(l) if end is None else end #此处end的意义?
-
mid_index = (end - start)//2 + start #寻找中间值
-
if start <= end: #start小于end才寻找,否输出找不到
-
if l[mid_index] < aim: # 中间值小于目标值
-
return find(l,aim,start =mid_index+1,end=end) #此处return的实际意义?
-
elif l[mid_index] > aim: # 中间值大于目标值
-
return find(l, aim, start=start, end=mid_index-1) #此处return的意义?
-
else: #大于小于之后返回寻找值
-
return "mid_index = %d"%mid_index
-
else:
-
return '找不到这个值,失败了'
-
-
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
-
ret= find(l,66)
-
print(ret)
-
-
#打印结果
-
-
mid_index = 17
|
-
斐波那契数列
阶乘实现斐波那契数列1、1、2、3、5、8、13……
-
#单递归,运算速度快
-
def fib(n,l = [1]): # n =6
-
l[0] +=1
-
if n ==1 or n == 2:
-
l[0] -= 1
-
return 1,1
-
else:
-
a,b = fib(n-1)
-
l[0] -= 1
-
print(l[0])
-
if l[0] == 1:
-
return a+b
-
return b,a+b
-
print(fib(50))
-
-
-
#双递归,递归效率低,运算复杂度大
-
def fib(n):
-
if n==1 or n==2
-
return 1
-
else :
-
return fib(n-1)+fib(n-2)
-
-
print(fib(30))
|
-
阶乘
Python实现阶乘
-
def fac(n):
-
if n == 1 :
-
return 1
-
else:return n*fac(n-1)
-
-
-
print(fac(6))
|