【问题标题】:Efficiency in Imperative programming and Functional programming [closed]命令式编程和函数式编程的效率[关闭]
【发布时间】:2012-09-11 14:09:15
【问题描述】:

我有一个关于 IP 和 FP 性能的问题。 假设我有一个计算第 n 个斐波那契数的函数。

在命令式编程中,我可以选择使用迭代方式、递归或动态编程来计算第 n 个斐波那契数。当然迭代方式和动态规划的性能会比渐近递归更好。

在函数式编程中,假设不涉及状态,那么我只能以递归方式进行。

在这种情况下,这是否意味着函数式编程在效率方面与命令式编程的性能总是相同或更慢(渐近地)?

现实世界的函数式编程如何处理这个问题?

【问题讨论】:

  • 您对命令式编程和函数式编程都做了很多假设。一些函数式语言在性能是最重要的问题的情况下允许不纯行为。

标签: performance algorithm functional-programming asymptotic-complexity imperative-programming


【解决方案1】:

没有一种递归方法可以实现斐波那契数列。您可以轻松编写一个递归函数,在 O(n) 时间内计算第 n 个斐波那契数 - 它的工作方式与迭代版本相同(即它会跟踪您计算的最后两个数字),但使用尾递归而不是命令式循环。由于许多函数式语言需要实现来执行尾调用优化,因此与迭代版本相比,甚至不会有恒定的开销。

当然,甚至还有一些方法可以在亚线性时间内计算第 n 个斐波那契数(使用封闭形式或矩阵乘法),这在函数式语言和命令式语言中同样有效。

关于动态编程:完全可以用函数式语言进行动态编程。由于动态编程算法一旦第一次编写数组的字段就不会改变它,因此这里与函数式编程实际上没有矛盾。您所需要的只是能够在构造数组时访问数组中已经构造的部分。 Haskell 中存在的惰性数组对此非常有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多