📅  最后修改于: 2020-04-06 08:56:57             🧑  作者: Mango
递归是一种编程技术,其中函数反复调用自身直到满足终止条件。使用递归的一些示例是:斐波那契数列,阶乘等的计算。但是它们的问题在于,在递归树中,有可能再次解决已经解决的子问题,这增加了开销。
记忆化是一种记录中间结果的技术,因此可用于避免重复计算并加快程序速度。它可以用来优化使用递归的程序。在Python中,可以在函数装饰器的帮助下完成备忘。
让我们以计算数字的阶乘为例。下面的简单程序使用递归来解决问题:
# Simple recursive program to find factorial
def facto(num):
if num == 1:
return 1
else:
return num * facto(num-1)
print(facto(5))
上面的程序可以通过使用装饰器的记忆来优化
# 使用装饰器来优化代码,辅助记忆.
# 函数f,作为参数传递
def memoize_factorial(f):
memory = {}
# 内部函数可以获取记忆和函数f
def inner(num):
if num not in memory:
memory[num] = f(num)
return memory[num]
return inner
@memoize_factorial
def facto(num):
if num == 1:
return 1
else:
return num * facto(num-1)
print(facto(5))
说明:
1 .已经定义了一个称为memoize_factoria的函数。它的主要目的是将中间结果存储在称为内存的变量中。
2.称为事实的第二个函数是计算阶乘的函数。它已经由装饰器(函数memize_factorial)注释。该事实可以访问存储器变量的闭包。注释的概念的结果等效于书写:
facto = memoize_factorial(facto)
3.调用facto(5)时,除存储中间结果外,还会进行递归操作。每次需要进行计算时,都会检查结果是否在内存中。如果是,则使用它,否则,将计算该值并将其存储在memory中。