Python函数递归
1、什么是函数递归?
函数递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称之为函数的递归调用
2、利用递归求和
①求1到998的总和:
def sum(n):
if n==1:
return 1
else:
return n+sum(n-1)
print(sum(998))
返回结果:
498501
如果将print(sum(998))改成print(sum(999))结果如下:
Traceback (most recent call last):
File "D:/Code/python练习/python函数/1、递归.py", line 7, in <module>
print(sum(999))
File "D:/Code/python练习/python函数/1、递归.py", line 6, in sum
return n+sum(n-1)
File "D:/Code/python练习/python函数/1、递归.py", line 6, in sum
return n+sum(n-1)
File "D:/Code/python练习/python函数/1、递归.py", line 6, in sum
return n+sum(n-1)
[Previous line repeated 994 more times]
File "D:/Code/python练习/python函数/1、递归.py", line 3, in sum
if n==1:
RecursionError: maximum recursion depth exceeded in comparison
注:实际上python对递归做了层级限制的,不会进入死循环,避免内存溢出。
②修改并且查看递归的次数限制:
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
返回结果:
1000
2000
③递归求斐波那契数列(自上而下,代码容易理解,但实际上重复了很多步骤,特别慢,后面的数甚至就求不出来):
import time
def fib(n):
# 判断是否为整数
if isinstance(n,int):
if n == 1 or n == 2:
return 1
else:
return fib(n-1)+fib(n-2)
else:
return 0
# 开始计时
startTime=time.perf_counter()
print(fib(33))
# 结束计时
endTime=time.perf_counter()
# 打印运行时间
print(endTime-startTime,"秒")
返回值:
3524578
1.8636762787061125 秒
④递归求斐波那契数列(自下而上,代码容易理解,减少重复了步骤,速度快):
import time
# 通过一个列表记录数列的值,减少递归的次数
def fib(n,k=1,sum=[]):
# 判断n是否为整数
if isinstance(n,int):
if k>n:
return sum[n-1]
elif k==1 or k==2:
sum.append(1)
return fib(n,k+1,sum)
else:
sum.append(sum[k-3]+sum[k-2])
return fib(n, k + 1, sum)
else:
return 0
# 计时开始
startTime=time.perf_counter()
print(fib(33))
# 计时结束
endTime=time.perf_counter()
# 打印运行时间
print(endTime-startTime,"秒")
返回结果:
3524578
4.777210590383001e-05 秒