递归函数 我现在觉得递归怎么还没有while Ture好用呢,但是,我的大神老师告诉我,人理解循环,神理解递归,递归真滴是很重要的,以后算法学习也会用到,想想就有些小激动呢。容我学会以后,在狠狠的在后生晚辈面前吹一吹牛逼,哈(意淫完毕)

递归函数

递归函数的定义:

  在一个函数里调用他本身,这种使用函数的方式就叫这做递归。

递归的最大深度:

def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)

最后得出结论,递归的最大深度是997,为什么是997呢,是因为python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

1 import sys
2 print(sys.setrecursionlimit(100000))

虽然说我们可以根据这个方式修改递归最大限制,但是如果你的代码997层递归都没有解决问题,那你的代码要么是太烂了(和本人一样),要么就是你所遇到的问题不适合用递归来解决。

再谈递归

for Example:

题目:

先问小鸡多大了?小鸡说:比小狗大2岁,现在你想知道小鸡的年龄,需要去问小狗,小狗说,比小猪大两岁

那你又要去问小猪,小猪说:比小牛大两岁,他们都太皮了,还好小牛老实,你去问小牛,小牛告诉你,他40了,

那你现在是不是知道小鸡多大了?小鸡多大?

那写成函数应该是什么样子的呢?

1 def age(n):
2     if n == 1:
3         return 40
4     else:
5         return age(n-1)+2
6 
7 print(age(4))

这样是不是就可以知道小鸡的年龄了呢,同学们,学会了木有,再来个重磅的

二分查找算法

题目二 

在这个列表里找到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]

是不是很easy!

1、index(66)

那么,题目升级,idnex方法不准用了,我的小可爱,你会怎么解决呢?(屏幕背后抠脚大汉摸了摸他的鼻子,会有女生看么~)

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]

i = 0
for num in l:
    if num == 66:
        print(i)
    i+=1

这样是不是就可以找到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 func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(l,66)
func(l,6)

二分法基础版
简单版
def search(num,l,start=None,end=None):
    start = start if start else 0
    end = end if end is None else len(l) - 1
    mid = (end - start)//2 + start
    if start > end:
        return None
    elif l[mid] > num :
        return search(num,l,start,mid-1)
    elif l[mid] < num:
        return search(num,l,mid+1,end)
    elif l[mid] == num:
        return mid

二分算法终极版
升级版