用记忆数组(列表)实现减少遍历次数和运行时间:
这里我们用,斐波那契数列 fib(n)= fib(n-1)+ fib(n-2)来做例子,下面看图:
(1)使用记忆数组的运行结果和代码【fib(50)】:
import sys
sys.setrecursionlimit(30000) #改变系统默认递归深度
def fib(n) :
global cnt
cnt += 1
if n==1 or n==2:
data[n]=1
return data[n]
if data[n] != 0: # 在记忆数组的,直接用,减少递归运算次数
return data[n]
data[n] = fib(n-1)+fib(n-2) # 没有在记忆数组的,计算完后保存到data[]
return data[n]
data=[0]*52 # 记忆数组,开始用0来填充,后续存储的结果会替代0
#为什么data[]是51,因为就是要多放1个
cnt =0
print(fib(50))
print('递归次数为:',cnt) # 递归次数cnt=
(2)“不使用记忆数组”的运行结果和代码【fib(40)】:
import sys
sys.setrecursionlimit(30000) #改变系统默认递归深度
def fib(n):
global cnt
cnt += 1 # 统计执行了多少次递归
if n==1 or n==2: # 到达终止条件
return 1
return fib(n-1)+fib(n-2)
cnt =0
print(fib(50))
print('递归次数为:',cnt) # 递归次数cnt=
上面两个案例的对比,可以得出结论:使用记忆数组明显减少递归次数和运行时间
—————————————关于如何知道函数的运行时间,请看下面———————————