【发布时间】:2011-02-23 19:48:45
【问题描述】:
我已经建立了递归函数来计算帕斯卡的三角形值。
有没有办法优化它?
关于帕斯卡三角形的简短提示:C(n, k) = C(n-1, k-1) + C(n-1, k) 我的代码是:
int Pascal(int n, int k) {
if (k == 0) return 1;
if (n == 0) return 0;
return Pascal(n - 1, k - 1) + Pascal(n - 1, k);
}
我看到的低效率是它存储一些值两次。 例子: C(6,2) = C(5,1) + C(5,2) C(6,2) = C(4,0) + C(4,1) + C(4,1) + C(4,2) 它会调用 C(4,1) 两次
知道如何优化这个功能吗?
谢谢
【问题讨论】:
-
我认为这是您所看到的递归的一个经典问题,而不是重新计算这些值,您应该将它们存储在类似数据结构的“表”中,而不是重新运行您进行查找的函数桌子。正是您所确定的,使用相同值调用函数的重叠是浪费处理时间(经典的过程时间/内存权衡)。我对此没有直接的解决方案,但您肯定有正确的想法。
-
一个小的优化是在 n == k 时返回 1,这会将速度从
O(Sum(C(n, i) for i from 0 to k))提高到O(C(n, k))。 -
@shaunhusain 谢谢,很清楚,我会分配一些内存! @Neil 也是个好主意。
标签: c++ recursion combinatorics pascals-triangle