【发布时间】:2015-09-15 02:58:39
【问题描述】:
我写了一个代码来计算两个无穷级数的商的系数,使用归约,如下:
main :: Int -> PInt
main 0 = 0
main n = cancel x3
where
x1 = someOtherFunction
x2 = expression involving x1
x3 = x2 - (foldr
(\y z -> z + (someOtherFunction y) * (main (n - y))) 0 [1..(n - 1)])
(我定义了一个叫PInt的数据,它是Num和Fractional的一个实例,还有一个辅助函数“cancel”来进行归约。)我的问题是x3中fold中的表达式:好像不是非常有效,因为它必须计算每个主 k 值以获得较低的 k 值。
我在想也许我可以使用诸如
之类的实现fib = 1 : 1 : zipWith (+) fib (tail fib)
对于斐波那契数计算上面的递归,效率更高。不幸的是,我不知道从哪里开始。
提前感谢您的帮助。
附:代码需要大量时间来计算 20 处的值,哪种行为似乎意味着时间呈指数增长?
【问题讨论】:
-
codereview.stackexchange.com 是要求对已经运行的代码进行审查的更好地方。
-
感谢您的信息。
-
(也许你可以简单地memoize
main。) -
@Mauris 实际上我使用了 memo1,我省略了显示,因为在这种情况下它不是很有用:没有太大区别。还是您建议我使用某种 memo_n 递归地记住它??
-
两种可能的解释:系数增长得如此之快以至于超过了重新计算早期系数的成本,或者你做错了记忆(不难)。