Functional programming 使用函数式语言有助于避免重复计算值吗?

Functional programming 使用函数式语言有助于避免重复计算值吗?,functional-programming,Functional Programming,考虑函数f(x,y): 如果在C++等语言中尝试实现递归,他会遇到问题。 假设首先使用x=x0和y=y0调用该函数。对于0的任何一对(x,y),您在这里寻找的术语是: 在计算领域,记忆化是一个重要的概念 主要使用的优化技术 加速计算机程序 让函数调用避免重复 计算结果 以前处理过的输入 不,函数式语言不会自动实现记忆。您可以在其中实现,但也可以在C++中实现。然而,当您编写纯功能性代码(即没有副作用)时,记忆就更容易了,这是事实。一些动态语言(例如Perl)具有自动记忆模块,可以轻松地记忆任何函

考虑函数f(x,y):

<>如果在C++等语言中尝试实现递归,他会遇到问题。
假设首先使用
x=x0
y=y0
调用该函数。对于
0的任何一对(x,y),您在这里寻找的术语是:

在计算领域,记忆化是一个重要的概念 主要使用的优化技术 加速计算机程序 让函数调用避免重复 计算结果 以前处理过的输入

不,函数式语言不会自动实现记忆。您可以在其中实现,但也可以在C++中实现。然而,当您编写纯功能性代码(即没有副作用)时,记忆就更容易了,这是事实。一些动态语言(例如Perl)具有自动记忆模块,可以轻松地记忆任何函数。报纸上有关于这个问题的讨论

例如,这里有一个天真的C++ Fibonacci:

long fib_rec(long index)
{
    if (index < 2)
        return index;
    else
        return fib_rec(index - 1) + fib_rec(index - 2);
}
long fib\u rec(长索引)
{
如果(指数<2)
收益指数;
其他的
返回fib_rec(索引-1)+fib_rec(索引-2);
}
这是一个记忆版本:

long fib_memoized_aux(vector<long>& cache, long index)
{
    if (cache[index] >= 0)
    return cache[index];

    cache[index] = fib_memoized_aux(cache, index - 1) + fib_memoized_aux(cache, index - 2);
    return cache[index];
}


long fib_memoized(long index)
{
    vector<long> cache(index + 1, -1);
    cache[0] = 0;
    cache[1] = 1;

    return fib_memoized_aux(cache, index);
}
long fib\u memonized\u aux(向量和缓存,长索引)
{
如果(缓存[索引]>=0)
返回缓存[索引];
cache[index]=fib_memorized_aux(缓存,索引-1)+fib_memorized_aux(缓存,索引-2);
返回缓存[索引];
}
长纤维记忆(长索引)
{
向量缓存(索引+1,-1);
缓存[0]=0;
缓存[1]=1;
返回fib_memorized_aux(缓存、索引);
}

这取决于实施情况。在函数式语言中,这并不是天生的更快。也就是说,我认为在函数式语言中实现这样的优化是可能的,但我不知道具体细节,所以我不会给出具体的答案。hash consing可以看作是对hash consed类型b的构造函数的一种记忆。对输入类型的值进行廉价的比较有利于记忆,而这正是hash consing所提供的。但在记忆整型参数函数的情况下,这一点是没有意义的。
long fib_memoized_aux(vector<long>& cache, long index)
{
    if (cache[index] >= 0)
    return cache[index];

    cache[index] = fib_memoized_aux(cache, index - 1) + fib_memoized_aux(cache, index - 2);
    return cache[index];
}


long fib_memoized(long index)
{
    vector<long> cache(index + 1, -1);
    cache[0] = 0;
    cache[1] = 1;

    return fib_memoized_aux(cache, index);
}