给我一个编写使用Pascal规则的递归函数的问题。我已经完成了该功能,并且可以正常工作,但是我知道可以使用备忘录对其进行改进。我不太确定该怎么做,因为这是我第一次实现备忘录。任何帮助,将不胜感激!这是我的代码:
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));
}
答案 0 :(得分:1)
如果这是您要学习递归的课堂练习,那么可以,您可以通过记忆“改善”它。但是,这只是潜在的严重无效算法的临时帮助。如果发现自己正在使用递归,则说明您是在以错误的方式来解决问题,或者正在处理的是一个没有有效解决方案的难题。递归关系可用作通过归纳证明性质的数学身份。它们没有用作实施策略。遗憾的是,在大多数CS程序中,这并不是很好的教导。
在实现“ n选择k”的情况下,Pascal三角形只是实现它的错误方法。取而代之的是,您使用Pascal的三角形根据阶乘来开发闭式公式,然后通过循环实现 that 。