對不起,如果這個問題已經被問到,我沒有找到它。對於我可憐的英語感到抱歉。Haskell列表的複雜性
我在學習Haskell並嘗試使用列表。 我寫了一個函數,它轉換一個特定模式後的列表,我不能檢查它現在是否有效,但我認爲是。
此功能是不是尾調用函數,所以我認爲這將是可怕的計算這個功能有一個大名單:
transform :: [Int] -> [Int]
transform list = case list of
(1:0:1:[]) -> [1,1,1,1]
(1:1:[]) -> [1,0,1]
[1] -> [1,1]
(1:0:1:0:s) -> 1:1:1:1: (transform s)
(1:1:0:s) -> 1:0:1: (transform s)
(1:0:s) -> 1:1: (transform s)
(0:s) -> 0: (transform s)
所以我想到了另一種功能,這將是「好」:
transform = reverse . aux []
where
aux buff (1:0:[1]) = (1:1:1:1:buff)
aux buff (1:[1]) = (1:0:1:buff)
aux buff [1] = (1:1:buff)
aux buff (1:0:1:0:s) = aux (1:1:1:1:buff) s
aux buff (1:1:0:s) = aux (1:0:1:buff) s
aux buff (1:0:s) = aux (1:1:buff) s
aux buff (0:s) = aux (0:buff) s
問題是我不知道它是如何編譯的,如果我錯了第二個函數。你能向我解釋清單是如何工作的嗎?最後使用(++)還是反轉列表更好?
預先感謝您爲您的回答
另請參閱http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons; HTTP://計算器。COM /問題/ 13042353 /的確,哈斯克爾具備尾遞歸優化。 –