递归函数


什么是递归函数:在函数中调用自己,自身函数就是递归

def story():
  print("helo")
  story()
print(111)  #永远执行不到这句话,
  #说明外层函数内存空间没有释放,这样容易浪费内存,那么超过固定限度就会报错
  #RecursionError:超过递归最大深度

story()

第一次调用story()生成一个内存空间,第二次调用story()的时候,
第一个内存空间没有释放,因为第一个函数还没有执行结束

 


可以设置递归最大次数:
import sys
sys.setrecursionlimit(10000)

如果递归次数太多,就不适合使用递归来解决问题
递归的缺点:占内存
递归的优点:会让代码变简单

 


递归求年龄的列子
alex多大 -- 44 + 2
alex比egon大两岁
egon多大? -- 42 + 2
egon比wusir大两岁
wusir多大 -- 40 + 2
wusir比靳老板大两岁
靳老板多大?
靳老板40了 -- 40


递:往下走的是递,归:往上走的是归
问题分析一次一次的往下,结果的回归
怎么写函数呢?
分析
当n = 1的时候,问alex多大 , age(1) = age(2)+2 = age(n+1)+2
当n = 2的时候,问egon多大 , age(2) = age(3)+2 = age(n+1)+2
当n = 3的时候,问wusir多大 , age(3) = age(4)+4 = age(n+1)+2
当n = 4的时候,问靳老板多大 , age(4) = age(4) = 40

当n = 4 的时候,age = 40
当n < 4的时候,age(n+1) + 2

def age(n):
  if n == 4:
    return 40
  elif n > 0 and n < 4 :
    return age(n+1) + 2
print(age(1))

 

教你看递归:

def age(1):
  if 1 == 4:
    return 40
  elif 1 > 0 and 1 < 4 :
    return age(1+1) + 2
print(age(1))


def age(2):
  if 2 == 4:
    return 40
  elif 2 > 0 and 2 < 4 :
    return age(2+1) + 2
print(age(2))


。。。。。。。。。

 


二分查找算法特点:
1、必须处理有序的列表
2、每次把数据一分为二,取列表中间值,在判断大小

如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

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):
  mid_index = len(l) // 2
  #mid_index = len(new_l) // 2 重复操作
    find(new_l,aim)
  elif l[mid_index] > aim:
    new_l = l[:mid_index]
    find(new_l,aim) #递归
  else:
    print('找到了',mid_index,l[mid_index])

find(l,66)

 


改良版

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 = len(l)):
  mid_index = (end - start) // 2 + start #计算中间值
  if l[mid_index] < aim:
    find(l,aim,start = mid_index+1,end=end)
  elif l[mid_index] > aim:
    find(l,aim,start = start,end=mid_index-1)
  else:
    print('找到了',mid_index,aim)

find(l,66)

 

升级版

参数 end
返回值
找不到的话怎么办

def find(l,aim,start = 0,end = None):
  end = len(l) if end is None else end
  mid_index = (end - start) // 2 + start #计算中间值
  if start <= end:
    if l[mid_index] < aim:
      return find(l,aim,start = mid_index+1,end=end)
    elif l[mid_index] > aim:
      return find(l,aim,start = start,end=mid_index-1)
    else:
      return 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)

试一试

67  发生两次调用

66发生好几次

44找不到

posted @ 2019-06-12 13:34  kate8Y  阅读(109)  评论(0)    收藏  举报