这是否被视为备忘录?

问题描述 投票:1回答:4

[最近在优化某些代码时,我们最终执行了我认为是备忘录的“类型”,但是我不确定是否应该这样称呼它。下面的伪代码不是actual算法(因为我们在应用程序中不需要析因,并且发布所说的代码是有罪的),但它足以解释我的问题。这是原始的:

def factorial (n):
    if n == 1 return 1
    return n * factorial (n-1)

足够简单,但是我们添加了固定点,因此对于大数可以避免进行大量计算,例如:

def factorial (n):
    if n == 1 return 1
    if n == 10 return 3628800
    if n == 20 return 2432902008176640000
    if n == 30 return 265252859812191058636308480000000
    if n == 40 return 815915283247897734345611269596115894272000000000
    # And so on.

    return n * factorial (n-1)

,这当然意味着12!被计算为12 * 11 * 3628800,而不是效率较低的12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

但是我想知道我们是否[调用此备忘录,因为它似乎被定义为remembering过去的计算结果并使用它们。这更多是关于硬编码计算(不记得)和使用该信息。

这个过程是否有合适的名称,或者我们可以声称记忆不仅可以追溯到运行时完成的计算,还可以追溯到编译时完成的计算,甚至还可以追溯到我开始编写该计算之前的头脑中的计算。代码?
optimization naming memoization
4个回答
4
投票
我将其称为预先计算而非记忆。您实际上并不记得在为给定输入计算最终答案的过程中所做的任何计算,而是针对特定输入预先计算了固定数量的答案。据我了解,记忆实际上更像是“缓存”一组结果,以便计算它们以供以后重用。如果要存储每个计算出的值,以便以后无需再次重新计算,那将是备忘录。您的解决方案的不同之处在于,您永远不会存储程序中的任何“已计算”结果,而仅存储已预先计算的固定点。使用备忘录时,如果您使用与预先计算的输入之一不同的输入来重新运行该函数,则不必重新计算结果,它将简单地重用它。

1
投票
无论您是否对结果进行硬编码,这仍然是备注,因为您已经计算了要再次计算的结果。现在,它可能以运行时或编译时的形式出现。.但这两种方式都是记忆。

1
投票
备忘在运行时完成。您正在编译时进行优化。因此,事实并非如此。

例如参见... Wikipedia

或...

    备忘术语记忆是唐纳德·米奇(Donald Michie,1968)提出的,指的是使函数记住先前计算结果的过程。近年来,随着功能语言的兴起,这个想法变得越来越流行。菲尔德和哈里森(1988)对此做了整整一章。基本思想只是保留一个先前计算的输入/结果对的表。
  • Peter Norvig
  • 加州大学(黑体字是我的)

    Link


    0
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.