递归,二分查找
初始递归
递归的定义--在一个函数里再调用这个函数本身
递归的最大深度是--997
正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(x): x += 1 print(x) return func(x) func(0)
由此我们可以看出,未报错之前能看到的最大数字就是997.当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys print(sys.setrecursionlimit(100000))
我们可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~
看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做:人理解循环,神理解递归。所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。来吧,只有学会了才有资本嫌弃!
递归之问年龄
首先,你是不是问alex的年龄,结果又找到egon、武sir、金鑫,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。
age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 40
那这样的情况下,我们的函数应该怎么写呢
def func(n): if n == 1: return 40 else: return func(n-1) + 2 print(func(4))
递归值三级菜单
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } menu
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def threeL(dic): while True: for item in dic: print(item) user_choice = input('>>>') if user_choice.strip() == 'b' or user_choice.strip() == 'q': return user_choice elif user_choice in dic.keys() and dic[user_choice]: ret = threeL(dic[user_choice]) if ret == 'q': return 'q' threeL(menu)
递归与二分查找
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]
二分查找
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(num, l, start=0, end=None): end = end if end is not None else len(l) - 1 mid_num = (end - start) // 2 + start if start > end: return None if num > l[mid_num]: return func(num, l, mid_num + 1, end) elif num < l[mid_num]: return func(num, l, start, end=mid_num-1) elif num == l[mid_num]: print(mid_num)