Optimization 这算是回忆录吗?

Optimization 这算是回忆录吗?,optimization,naming,memoization,Optimization,Naming,Memoization,最近在优化一些代码时,我们最终执行了我认为是“类型”的回忆录,但我不确定我们是否应该这样称呼它。下面的伪代码不是实际的算法(因为我们在应用程序中几乎不需要阶乘,发布所述代码是一种冒犯),但它应该足以解释我的问题。这是原作: def factorial (n): if n == 1 return 1 return n * factorial (n-1) 很简单,但我们添加了固定点,这样就可以避免对较大的数字进行大量计算,例如: def factorial (n): if

最近在优化一些代码时,我们最终执行了我认为是“类型”的回忆录,但我不确定我们是否应该这样称呼它。下面的伪代码不是实际的算法(因为我们在应用程序中几乎不需要阶乘,发布所述代码是一种冒犯),但它应该足以解释我的问题。这是原作:

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

但我想知道我们是否应该称之为记忆,因为它似乎被定义为记住过去的计算结果并使用它们。这更多的是关于硬编码计算(不记得)和使用这些信息


这个过程有一个合适的名字吗?或者我们可以说,记忆不仅可以追溯到运行时完成的计算,还可以追溯到编译时完成的计算,甚至可以追溯到我开始编写代码之前在脑海中完成的计算?

无论您是否在硬编码结果,这仍然是备忘录,因为您已经计算了预期要再次计算的结果。现在这可能以运行时或编译时的形式出现。。但无论哪种方式,它都是记忆。

无论您是否对结果进行硬编码,这仍然是记忆,因为您已经计算了结果,希望再次计算。现在这可能以运行时或编译时的形式出现。。但无论哪种方式,它都是内存化。

内存化是在运行时完成的。您正在编译时进行优化。所以,事实并非如此

例如,见

或者

  • 回忆录 “记忆化”一词由唐纳德·米奇(Donald Michie,1968年)发明,是指一个函数自动记忆先前计算结果的过程。近年来,随着函数式语言的兴起,这种思想变得越来越流行;菲尔德和哈里森(1988)用了整整一章来论述它。其基本思想就是保留一个包含先前计算的输入/结果对的表 彼得·诺维格 加利福尼亚大学 (黑体字是我的)


    记录在运行时完成。您正在编译时进行优化。所以,事实并非如此

    例如,见

    或者

  • 回忆录 “记忆化”一词由唐纳德·米奇(Donald Michie,1968年)发明,是指一个函数自动记忆先前计算结果的过程。近年来,随着函数式语言的兴起,这种思想变得越来越流行;菲尔德和哈里森(1988)用了整整一章来论述它。其基本思想就是保留一个包含先前计算的输入/结果对的表 彼得·诺维格 加利福尼亚大学 (黑体字是我的)


    我称之为预计算,而不是记忆。在计算给定输入的最终答案的过程中,您并没有真正记住您所做的任何计算,而是为特定输入预先计算了一些固定数量的答案。据我所知,记忆实际上更类似于在计算一组结果以供以后重用时“缓存”它们。如果要存储每个计算出的值,这样以后就不需要重新计算,那么这就是记忆。您的解决方案的不同之处在于,您从不存储程序中的任何“计算”结果,只存储预先计算的固定点。有了记忆功能,如果重新运行函数时输入的输入与预先计算的输入不同,则不必重新计算结果,只需重复使用即可。

    我称之为预先计算,而不是记忆功能。在计算给定输入的最终答案的过程中,您并没有真正记住您所做的任何计算,而是为特定输入预先计算了一些固定数量的答案。据我所知,记忆实际上更类似于在计算一组结果以供以后重用时“缓存”它们。如果要存储每个计算出的值,这样以后就不需要重新计算,那么这就是记忆。您的解决方案的不同之处在于,您从不存储程序中的任何“计算”结果,只存储预先计算的固定点。使用Memorization,如果重新运行函数时输入的输入与预先计算的输入不同,则不必重新计算结果,只需重复使用即可。

    是。这是一种回忆录。你还需要知道什么?这就是我需要知道的。它与Wikipedia条目不一致,Wikipedia条目明确指出:
    一个记忆函数“记住”与某组特定输入对应的结果。具有记住的输入的后续调用将返回记住的结果,而不是重新计算它,…
    。我想可能会有一个不同的术语来表示它不记得,而是硬编码的情况。好吧,到目前为止,我有两个答案,是和否。这意味着可能需要引用权威来源。我会把这个问题留几个小时,看看会有什么结果。“可能需要权威来源”?真正地为什么这是正确的记忆,接近记忆,不是真正的记忆,或者根本不是记忆,这很重要?你的民意调查结果是否会带来金钱?这很重要,因为我们都应该想用正确的术语来描述我们正在讨论的问题。对于想知道气泡排序是否可以称为快速s的人来说,这没有什么不同
    def memoisation(f):
        dct = {}
        def myfunction(x):
            if x not in dct:            
                dct[x] = f(x)
            return dct[x]
        return myfunction
    
    @memoisation
    def fibonacci(n):
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fibonacci(n-1) + fibonacci(n-2)
    
    def nb_appels(n):
        if n==0 or n==1:
            return 0
        else:
            return  1 + nb_appels(n-1) + 1 + nb_appels(n-2)
    
    
    print(fibonacci(13))
    print ('nbappel',nb_appels(13))