递归函数
递归函数简介
之前讲到函数的定义可以嵌套,函数装饰器也可以嵌套,函数的调用也可以嵌套。在函数调用的嵌套里,调用函数的内部,又直接或者间接地调用了函数自身,这就称为函数的递归调用,又称为递归函数。
形式一:直接调用函数自身
# 示例
def index(count):
print(count)
count +=1
index(count)
index(0) # 结果为997之后报错'maximum recursion depth exceeded while calling a Python object'

形式二:间接调用自身(两函数互相调用)
# 示例
def index(): # 函数一
global count
count += 1
print(count)
print('hahaha')
func() # 调用函数二
def func(): # 函数二
print('xixixi')
global count
count += 1
print(count)
index() # 调用函数一
func() # 运行到第999次报错

以上两种方式的执行结果报错是因为函数的最大递归深度超出限制(默认最大限制是1000,不过不同的计算机可能稍微有一些偏差),然后Python解释器的应急机制启动,阻止函数继续运行。需要注意的是并不是所有的编程语言都有像Python一样的应急机制。
最大递归深度相关的操作
import sys # 加载模块
print(sys.getrecursionlimit()) # getrecursionlimit关键字获取系统的默认最大递归深度
'''
为了不让代码因为超出最大递归深度而报错,从而终止程序,可以用setrecursionlimit关键字修改最大递归深度的限制,避免报错。
'''
sys.setrecursionlimit(1200)
def index(count):
print(count)
count += 1
index(count)
index(0)

递归函数的原则
- 函数每一次递归都必须向解决问题的答案靠拢(问题复杂度降低)
- 函数递归要有明确的结束条件限制
问题练习:
问题一:求59049是3的多少次方?
def get_num(n, count): # 传两个参数,第一个是n的值,第二个是记除以3的次数
if n == 1:
return count # 当n等于1的时候返回count的数值
return get_num(n/3, count + 1) # n不等于1的时候递归,参数n除以三,参数count加一
print(get_num(59049, 0))
问题二:循环打印列表内的数字
name_list = ['olive', ['jason', ['kevin', ['justin', ['ber', ['sil', ['cam']]]]]]]
def num(list_name):
for i in list_name:
if isinstance(i, str): # 判断某个元素是否是某种类型
print(i)
else:
num(i)
num(name_list)

递归函数结束

浙公网安备 33010602011771号