簡體   English   中英

OCaml中的遞歸:與Concat反向

[英]Recursion in OCaml: Reverse with Concat

我有一個關於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 ;;

我知道這不是反轉列表的最佳方法,但是現在我只對兩個遞歸函數如何相互作用感興趣。

謝謝!

如果您將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM