初识递归
递归的定义:
在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
递归的最大深度--997
递归函数不受外力的阻止会一直执行下去,python为了杜绝此类现象,强制将递归层数控制在997层。
如下为测试python遇到此类情况强制停止的现象
def foo(n): print(n) n += 1 foo(n) FOO(1)
#以上为死循环,python会一直执行997次后便提醒用户
以上手段为python为了让用户程序的内存优化所设定的一个默认值,我们也可以自定义它:
import sys print(sys.setrecursionlimit(10000)) def foo(n): print(n) n += 1 foo(n) foo(1) #以上设定的是10000次,但是笔者的电脑只能递归3219次,便停止了,取决于电脑性能。
再谈递归
假设有一个求年龄的需求,大体如下:
现在你们问我,Alex多大了?我说我不告诉你,但Alex比 Egon 大两岁。
你想知道Alex多大,你是不是还得去问Egon?Egon说,我也不告诉你,但我比Eva大两岁。
你又问Eva,Eva也不告诉你,她说她比Jack大两岁。
那你问Jack,Jack告诉你,他40了。。。
通过挨个询问,这时候你已经知道Alex的年龄了。我们具体分析以下,这几个人之间的规律。
像这种情况,我们用函数应该怎么快速的求Alex的年龄呢?
def age(n): if n == 1: return 40 else: return age(n-1)+2 print(age(4))
递归函数与三级菜单
menu = { '北京': { '海淀': { }, '昌平': { }, '朝阳': { }, '东城': { }, }, '上海': { '闵行', '闸北', }, } def threeLM(dic): while True: for k in dic:print(k) key = input('input>>').strip() if key == 'b' or key == 'q':return key elif key in dic.keys() and dic[key]: ret = threeLM(dic[key]) if ret == 'q': return 'q' elif (not dic.get(key)) or (not dic[key]) : continue threeLM(menu)