All*_*ang 8 recursion ocaml functional-programming list
我是Ocaml的新手,只是想确保如何执行一个简单的函数,比如使用递归函数返回列表的第n个元素?
原型样get_nth (list, n) 带int list * int -> int
例如 get_nth ([1,2,3], 1) -> 2
谢谢
pad*_*pad 13
您可能没有注意到,但List模块中List.nth已经存在功能.
如果要使用递归编写它:
let rec get_nth = function
| [], _ -> raise (Failure "get_nth")
| _, n when n < 0 -> raise (Invalid_argument "get_nth")
| x::_, 0 -> x
| x::xs, n -> get_nth(xs, n-1)
Run Code Online (Sandbox Code Playgroud)
使用元组作为这样的参数在OCaml中并不常见.通常你会使用currying并定义你的函数,如下所示:
let get_nth list n = ...
Run Code Online (Sandbox Code Playgroud)
这将有签名'a list -> int -> 'a.另请注意,'a此处有一个参数,这意味着,没有任何理由将您的功能仅限于整数.
现在让我们看一下这个问题.如果你想获得第0个元素,你的函数会是什么样子?
let get_nth list 0 = List.head list (* this is not actually valid in OCaml *)
Run Code Online (Sandbox Code Playgroud)
现在,如果你有一个函数从m个项目列表中获取第n个元素(NB n> m),你怎么能用这个函数构建另一个函数,它从m + 1个元素列表中得到第n + 1个元素?让n + 1个元素的函数成为get_nth'
let get_nth' list n' = get_nth (List.tail list) (n'-1)
Run Code Online (Sandbox Code Playgroud)
现在你需要做的就是将两者结合起来,你就完成了.我会把最后一部分留给你.
如果你遵循这个建议,你会得到比它必须更复杂的东西.但是,通过这种方式更容易理解发生了什么.