【问题标题】:Recursion in OCaml: Reverse with ConcatOCaml 中的递归:使用 Concat 进行反向
【发布时间】:2019-07-24 07:52:27
【问题描述】:

我对 OCaml 中递归函数的执行流程有疑问。这是场景:

我有两个递归函数,ConcatReverse。反向调用 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 ;;

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

谢谢!

【问题讨论】:

    标签: list recursion ocaml


    【解决方案1】:

    如果您将 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]
    

    【讨论】:

      【解决方案2】:

      函数,无论是否递归,都是通过首先以未指定的顺序评估它的所有参数,然后用它们调用函数来评估的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 2012-04-30
        • 1970-01-01
        • 2016-08-01
        相关资源
        最近更新 更多