在Haskell中遵循Fibonacci函数O(n)

时间:2016-09-01 00:37:17

标签: haskell big-o lazy-evaluation fibonacci

正如我在SICP中所了解到的,树递归的复杂性随着n呈指数增长。如果在Haskell我写的是,

fib n | n <= 1 = n
      | otherwise = fib (n-1) + fib (n-2)

是不是真的,因为Haskell是懒惰的,它计算fib 1fib 2 ...都是一次,所以复杂性与n是线性的?

1 个答案:

答案 0 :(得分:3)

Debug.Trace可以给出fib被调用的次数:

import Debug.Trace

fib :: Int -> Int
fib n = trace "CALL" $ case n of
  0 -> 0
  1 -> 1
  _ -> fib (n-1) + fib (n-2)

对于fib 5,它打印CALL 15次,因此它不是O(n)。