解释器运行递归
执行函数时,先将函数中所调用的函数压入栈。所有的函数压入栈后,遵循先进先出的原则进行执行。
def print_num(n):
if n > 0:
print_num(n-1)
print(n)
- python的递归深度默认情况下不超过998,
- 大于998,会出现“RuntimeError: maximum recursion depth exceeded”,即爆栈错误。
for循环
将上述代码,改写为for循环实现。
def print_num(n):
counter = 0
while counter < n:
print(counter)
counter += 1
这样改写之后,不存在压入栈的问题。每次循环都是对counter赋值,节省了内存空间。
退出递归函数
递归函数是先将所需的函数全部压入栈之后,再执行。它们执行的关系是这样的:
printN(1000)
printN(999)
printN(998)
...
用return只是返回到这个栈的上一级。如果想结束整个函数,需要开启线程,直接用sys.exit
。
def find(key):
source = {'奴隶社会': [
{'非洲': [{'古埃及文明': ['金字塔']}]},
{'亚洲': [{'两河流域文明': ['汉谟拉比法典']}, {'古印度': ['种姓制度', '佛教的创立']}]},
{'欧洲': [{'希腊': ['希腊城邦', '雅典民主']}, {'罗马': ['城邦', '帝国的征服与扩展']}, {'希腊罗马古典文化': ['建筑艺术', '公历']}]}
]}
wrong = f"不存在关键字:{key}"
q = []
# 进行查找
t = threading.Thread(target=i_find, args=[key, source, q])
t.start()
t.join()
def i_find(key, source, q):
"""
:param key:查询关键字
:param source: 查询范围
:param q: 查询结果
:return: void
"""
if isinstance(source, dict):
for k in source:
if k == key:
q.append(key)
sys.exit(1)
else:
for item in source[k]:
q.append(k)
i_find(key, item, q)
else:
if key == source:
q.append(key)
sys.exit(1)
这个函数用来查找key是否在source中,为了能够在查找完成后退出,在find函数
中开启了一个线程。