【发布时间】:2020-03-18 19:46:57
【问题描述】:
考虑以下用于计算第 n 个斐波那契数的 Haskell 代码。
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
这段代码很慢。我们可以通过重构为“迭代”计算的辅助函数来优化它,通过“存储”所有相关数据以计算其参数中的递归,以及一个告诉我们计算多长时间的“计数器”。
fastfib :: Int -> Int
fastfib n = helper 1 0 n
where
helper a _ 1 = a
helper a b i = helper (a + b) a (i - 1)
似乎这种优化也可以应用得更广泛。它在函数式编程社区或其他地方有名字吗?
【问题讨论】:
-
这不是简单的重构。它完全改变了算法。充其量,它是高级记忆的一种形式:使用记忆我们会记住所有先前计算的结果,而在这种情况下,我们只记得最后两个,因为那是我们需要的。您还可以在算法中看到类似技术的“动态编程”。
-
@chi 是的,我同意这不是简单的重构。
-
你熟悉memoization吗?
标签: haskell optimization functional-programming recurrence