[英]Recursion in OCaml: Reverse with Concat
我有一个关于OCaml中递归函数的执行流程的问题。 这是场景:
我有两个递归函数, Concat和Reverse 。 反向调用Concat。 任何人都能够解释当我提交列表时会发生什么[1; 2; 3]?
let rec concat (l1,l2) =
match l1 with
[] -> l2
| (h::t) -> h::(concat (t,l2));;
let rec reverse (l: int list) =
match l with
[] -> []
| (h :: t) -> concat (reverse t, [h]);;
// Call
let list1 = [1; 2; 3] ;;
reverse list1 ;;
我知道这不是反转列表的最佳方法,但是现在我只对两个递归函数如何相互作用感兴趣。
谢谢!
如果您将concat
注释为包含两个整数列表:
let rec concat (l1, l2 : int list * int list) =
. . .
您可以要求toplevel(OCaml REPL)跟踪函数调用和返回值。 这可能会告诉您确切的内容。
$ rlwrap ocaml
OCaml version 4.06.1
. . .
# trace concat;;
concat is now traced.
# trace reverse;;
reverse is now traced.
# reverse [1; 2; 3];;
reverse <-- [1; 2; 3]
reverse <-- [2; 3]
reverse <-- [3]
reverse <-- []
reverse --> []
concat <-- ([], [3])
concat --> [3]
reverse --> [3]
concat <-- ([3], [2])
concat <-- ([], [2])
concat --> [2]
concat --> [3; 2]
reverse --> [3; 2]
concat <-- ([3; 2], [1])
concat <-- ([2], [1])
concat <-- ([], [1])
concat --> [1]
concat --> [2; 1]
concat --> [3; 2; 1]
reverse --> [3; 2; 1]
- : int list = [3; 2; 1]
函数,递归与否,通过首先以未指定的顺序评估所有参数然后用它们调用函数来评估。
因此,例如concat (reverse t, [h])
将首先评估反向,然后调用concat。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.