递归函数,二分查找

1.递归函数

2.二分查找

递归函数:自己调用自己,默认递归次数:998.   递归到一定次数就会主动终止,998次(为了保护内存)

例: def  func():

    print(666)

    func()

  func()

上面的例子就是简单的递归函数.

可设置递归函数的次数

import sys

sys.setrecursionlimit(设定次数)

def  func(n):

  n += 1
  print

  func(n)

n = 0

func(n)

"""alex比佩奇大两岁  

佩奇比文周大两岁

文周比太白大两岁

太白26岁

"""

def  age(n):

  if  n == 1:

    return 26

  else:

    return age(n-1) +2

print(age(4))  #age(3) + 2

里面的操作流程分解

"""

def  age(4):

  if n == 1:

    return 26

  else:

    return age(3) +2

def  age(3):

  if n == 1:

    return 26

  else:

    return age(2) + 2

def age(2):

  if n == 1:

    return 26

  else:

    return age(1) +2

def age(1):

  if n == 1:

    return 26

  else:

    return age(0) + 2

print(age(4))

age(4) = 26 + 2+ 2+2

以上就是简单的递归函数.比较绕,喜欢的可以深入了解.

二分查找:二分查找算法,最经典最简单的算法.

使用二分查找算法前提:有序的 不重复的数字序列.

 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  index(1,aim):

  count = -1

  for i in l:

    count += 1

    if i == aim:

      return count

  return "没有此值"

print(index(l,84)

用这种方法很慢,如果数据太大的话,就不合适用这种方法.下面我们用一下二分查找算法来实现.

第一版  原列表发生改变,导致索引改变.

l = [2,3,5,10,15,16,18]

def two_find(l,aim):

  mid_index = len(l)//2

  if aim>l[mid_index]:

    return two_find(l[mid_index]+1:],aim)

  elif aim<l[mid_index]:

    return two_find(l[:mid_index],aim)

  elif aim == l[mid_index]:

    return mid_index

  else:

    return None

print(two_find(l,18)

上面这个二分查找算法是错误的,因为每次调用都会改变索引,得到的结果只有0或者1,这不是我们想要的,所以根据上面的问题我们进行了修改.

l = [2,3,5,10,15,16,18]

def  func(l,a,start = 0,end = None):

  end = len(l) if end != None else end=None

  a_index=(end+start)//2

  if end >=start:

    if a > l[a_index]:

      return func(l,a,start = a_index+1,end=end)

    elif a< l[a_index]:

      return func(l,a,start = start,end = a_index-1)

    elif a == l[a_index]:

      return a_index

  else:

    return None

print(func(l,a))

上面这个就是正确的二分查找法,很绕很绕,一定要理解性记忆,否则会死的很惨,有问题一定要及时解决,不要耽搁,弄明白.

原文地址:https://www.cnblogs.com/fengkun125/p/9214580.html