我正在做一個Haskell任務,我在想辦法讓我的代碼更快。 例如,我的因子函數下面查找某個整數的除數。haskell長度運行時間O(1)或O(n)
factors :: Int -> Int
factors x = length [n | n <- [1..x], mod x n == 0]
但是,我想我可以通過避免使用「長度」來使我的代碼更快。
factors :: Int -> Int
factors x = go 1
where
go :: Int -> Int
go i
| i == x = 1
| mod x i == 0 = 1 + go (i + 1)
| otherwise = go (i + 1)
我想知道如果Haskell的長度函數爲O(n)等的strlen()的C或O(1)像string.length減()在Java中。
此外,有沒有更好或更有效的寫我的代碼?
但這不是一個字符串。 –
ArrayList.size()如何呢?關鍵是複雜性,而不是具體類型。 – cHao
在編譯器優化了這段代碼之後,第一個「因素」表達式的評估似乎甚至不涉及構建一個列表。請記住懶惰評估是如何工作的 - 你不是「構建一個列表,然後計算其大小」 - 你正在計算列表元素*,因爲它們正在被生成*。 –