OCaml中的递归:与Concat反向

时间:2019-03-02 13:13:18

标签: list recursion ocaml

我对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 ;;

我知道这不是反向列表的最佳方法,但是现在我只对两个递归函数如何相互配合感兴趣。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您将concat注释为采用两个整数列表:

let rec concat (l1, l2 : int list * int list) =
. . .

您可以要求顶级(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]

答案 1 :(得分:0)

通过递归地评估函数的所有参数,然后使用它们调用函数,来评估函数(递归与否)。

例如,concat (reverse t, [h])首先将评估反向,然后调用concat。