【问题标题】:Could I improve this recursive function with memoization?我可以通过记忆来改进这个递归函数吗?
【发布时间】:2021-02-21 20:22:19
【问题描述】:

我在编写一个使用 Pascal 规则的递归函数时遇到了问题。我完成了该功能并且它正在工作,但是,我知道它可以使用 memoization 来改进。我不太清楚该怎么做,因为这是我第一次实现记忆。任何帮助,将不胜感激!这是我的代码:

long choose(int n, int k) {
    if (k == 0 || n == k) {
        return 1;
    }
    else {
        return choose(n - 1, k) + choose(n - 1, k - 1);
    }
}

这是我测试它的方式:

int main(int argc, char **argv) {
    int n = atoi(argv[1]);
    int k = atoi(argv[2]);
    printf("%ld \n", choose(n, k));
}

【问题讨论】:

  • 您可以使用将nk 映射到函数返回值的全局二维数组。
  • 您可以注意到choose(n, k) 将计算choose(n - 1, k - 1) 并将调用choose(n - 1, k),这也将计算choose(n - 1, k - 1)。所以它至少被计算了两次——这意味着它是通过记忆优化的主题。
  • 我认为任何时候计算不止一次都值得考虑。对于 n=10,k=5 的许多项目被计算了 35 次甚至 70 次:onlinegdb.com/HJ6YzSPKw memoization 将函数调用的数量从 503 降至 51:onlinegdb.com/HJF7rHDtw

标签: c function recursion optimization memoization


【解决方案1】:

如果这是您正在学习递归的课程的练习,那么是的,您可以通过记忆来“改进”它。然而,这只是底层效率极低的算法的创可贴。如果您发现自己使用递归,那么您要么以错误的方式解决问题,要么正在处理一个没有有效解决方案的非常困难的问题。递归关系可用作通过归纳证明性质的数学恒等式。它们不能用作实施策略。遗憾的是,大多数 CS 课程都没有很好地教授这一点。

在实现“n选择k”的情况下,帕斯卡三角形只是错误的实现方式。取而代之的是,您使用帕斯卡三角形根据阶乘来开发封闭形式的公式,然后用循环实现 that

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2015-12-31
    • 2014-01-21
    相关资源
    最近更新 更多