fun reverse ( [] ) = ( [] )
| reverse (x::xs) = reverse (xs) :: [x]
為什么我的這個反轉串列的功能不起作用
uj5u.com熱心網友回復:
你的函式有 type 'a list -> 'a list。::有型別'a -> 'a list -> 'a list。因此,您不能將呼叫的結果reverse作為第一個引數傳遞給::.
您可以@ 按照 JRose 的建議使用,因為它具有型別'a list -> 'a list -> 'a list并將連接兩個串列,但與::. @是 O(n)。使用它可以獲得reverseO(n^2) 的運行時效率。
相反,讓我們使用尾遞回輔助函式使用 以相反的順序構建累加器串列::,然后將其回傳。因為::是 O(1),所以這具有 O(n) 的運行時效率,這要好得多。
fun reverse lst =
let
fun aux [] acc = acc
| aux (x::xs) acc = aux xs (x :: acc)
in
aux lst []
end
考慮反轉[1, 2, 3]:
reverse [1, 2, 3]
aux [1, 2, 3] []
aux [2, 3] [1]
aux [3] [2, 1]
aux [] [3, 2, 1]
[3, 2, 1]
進一步閱讀@和的效率::。該鏈接談到OCaml,但核心原則在SML中是相同的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505442.html
下一篇:如何將元組中的元素相加?
