【发布时间】:2017-12-06 01:18:18
【问题描述】:
所以这是一个斐波那契项计算函数(在 Ruby 中):
def fibfast(n)
xs = [0,1]
(n-1).times do |i|
next_term = xs.sum
xs[0]=xs[1]
xs[1]=next_term
end
return xs[1]
end
我很确定它具有恒定的空间复杂度(它唯一存储的数据在 xs 中)和线性时间复杂度(它使用一个循环来计算序列的第 n 项)。
我的问题是,函数是递归的吗?它使用它计算的值来做更多的计算,但从不调用自己。我的另一个问题是,如何在 Haskell 中获得同样的时空紧凑性?我发现 Haskell 函数的空间复杂度大于 O(1),返回完整的术语列表,和/或它们的时间复杂度大于 O(n),因为它们使用典型的递归定义。
感谢任何想法,谢谢!
【问题讨论】:
-
为什么递归定义的时间复杂度更高。
-
递归定义的斐波那契函数需要更多的计算,我相信它的复杂度是O(2^n)。
-
@ZacharyBechnoefer:如果您使用 累加器,则不会。
-
如果你同时从迭代切换到递归和从这个标准算法切换到朴素算法,那么是的,你得到 O(fib(n)) 时间复杂度。但是只是从迭代风格切换到递归风格——同时保持相同的算法——将保持相同的 O(n) 时间复杂度。
标签: haskell recursion complexity-theory fibonacci