递归函数
递归函数的定义:
在一个函数里调用他本身,这种使用函数的方式就叫这做递归。
递归的最大深度:
def foo(n): print(n) n += 1 foo(n) foo(1)
最后得出结论,递归的最大深度是997,为什么是997呢,是因为python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:
1 import sys 2 print(sys.setrecursionlimit(100000))
虽然说我们可以根据这个方式修改递归最大限制,但是如果你的代码997层递归都没有解决问题,那你的代码要么是太烂了(和本人一样),要么就是你所遇到的问题不适合用递归来解决。
我现在觉得递归怎么还没有while Ture好用呢,但是,我的大神老师告诉我,人理解循环,神理解递归,递归真滴是很重要的,以后算法学习也会用到,想想就有些小激动呢。容我学会以后,在狠狠的在后生晚辈面前吹一吹牛逼,哈(意淫完毕)
再谈递归
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 二分算法终极版