正如我在SICP中所了解到的,树递归的复杂性随着n呈指数增长。如果在Haskell我写的是,
fib n | n <= 1 = n
| otherwise = fib (n-1) + fib (n-2)
是不是真的,因为Haskell是懒惰的,它计算fib 1
,fib 2
...都是一次,所以复杂性与n是线性的?
答案 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)。