递归、二分法

递归

  函数自己调用自己

  最大深度:1000,一般到不了1000就停了

   setrecursionlimit() 方法可以修改深度

  使用递归方法打印1到10

def fun(x,y):
    if x > y:
        return
    else:
        print(x)
        fun(x+1,y)
fun(1,10)
#结果:
#1
#2
#3
#4
#5
#6
#7
#8
#9
#10

  

二分法

  核心:掐头去尾取中间,一次砍一半
  两种算法:常规循环,递归循环
  常规循环
def f(arr,t):
    low = 0
    height = len(arr)-1
    while height >= low:
        mid = (low+height) // 2
        if t < arr[mid]:   #low:mid
            height = mid - 1
        elif t > arr[mid]:  # mid:height
            low = mid + 1
        else:
            print("找到了在第%s个位置" % (mid + 1))
            return
    print("没有找到此值")

arr = [1,3,5,13,17,19,20,21,26,30]
f(arr,21)
f(arr,13)
f(arr,38)
#结果
#找到了在第8个位置
#找到了在第4个位置
#没有找到此值

  递归循环

arr = [1,3,5,13,17,19,20,21,26,30]
def f(t,low,height):
    if height >= low:
        mid = (low+height) // 2
        if t < arr[mid]:   #low:mid
            height = mid - 1
            return f(t,low,height)
        elif t > arr[mid]:  # mid:height
            low = mid + 1
            return f(t,low,height)
        else:
            print("找到了")
            return mid
    else:
        print("没有找到此值")
        return -1
ret = f(26,0,len(arr)-1)
print(ret)
ret = f(11,0,len(arr)-1)
print(ret)
#结果
#找到了
#8
#没有找到此值
#-1

  

posted @ 2018-08-15 15:58  AndyStrack  阅读(253)  评论(0编辑  收藏  举报