【发布时间】: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));
}
【问题讨论】:
-
您可以使用将
n和k映射到函数返回值的全局二维数组。 -
您可以注意到
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