[英]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.