使用递归反转 OCaml 中的列表
Reversing a list in OCaml with recursion
我正在寻找一种在 Ocaml 中反转列表的算法:
let rec reverseList list revList=
match list with
| [] -> revList
| h::t -> reverseList t revList@[h]
一个使用示例是:
let list = [1;2;3;4];;
reverseList list [];;
而且我想知道为什么会这样。据我了解,如果我们按照上面的定义反转 list,我们将查看函数调用:
reverseList [1;2;3;4] []
reverseList [2;3;4] [1]
reverseList [3;4] [1;2]
reverseList [4] [1;2;3]
reverseList [] [1;2;3;4]
这会 return [1;2;3;4]。但是,此代码有效。那么为什么它有效,为什么不是最后一行
| h::t -> reverseList t [h]@revList
我隐隐约约知道它与柯里化有关,但我不太了解。请帮忙!
表达式:
reverseList t revList@[h]
解析如下:
(reverseList t revlist) @ [h]
也就是说,它首先递归地反转尾部,然后将新元素添加到末尾。这确实有效(尽管它不是反转列表的有效方法。)
另请注意,revList
参数只是一个空列表。
我正在寻找一种在 Ocaml 中反转列表的算法:
let rec reverseList list revList=
match list with
| [] -> revList
| h::t -> reverseList t revList@[h]
一个使用示例是:
let list = [1;2;3;4];;
reverseList list [];;
而且我想知道为什么会这样。据我了解,如果我们按照上面的定义反转 list,我们将查看函数调用:
reverseList [1;2;3;4] []
reverseList [2;3;4] [1]
reverseList [3;4] [1;2]
reverseList [4] [1;2;3]
reverseList [] [1;2;3;4]
这会 return [1;2;3;4]。但是,此代码有效。那么为什么它有效,为什么不是最后一行
| h::t -> reverseList t [h]@revList
我隐隐约约知道它与柯里化有关,但我不太了解。请帮忙!
表达式:
reverseList t revList@[h]
解析如下:
(reverseList t revlist) @ [h]
也就是说,它首先递归地反转尾部,然后将新元素添加到末尾。这确实有效(尽管它不是反转列表的有效方法。)
另请注意,revList
参数只是一个空列表。