我寫了一個簡單的函式來復制串列中的每個元素給定的次數。
let rec replicate l n =
let rec f l n acc =
match l with
|[]->acc
|x::xs->f xs n (let rec h e n acc = if n = 0 then acc else h e (n-1) (e::acc) in h x n acc)
in List.rev (f l n [])
這在我呼叫f
并將其累加器設定為輔助方法的結果時作業h
但是為什么下面的方法不起作用?
let rec replicate l n =
let rec f l n acc =
match l with
|[]->acc
|x::xs->(let rec h e n acc = if n = 0
then f xs n acc else h e (n-1) (e::acc)
in h x n acc)
in f l n [];;
在這里我呼叫外部函式f
以防萬一n=0
。
以下是使用兩個函式進行相同呼叫的結果:
- 復制 ["a"; “乙”;"c"] 3;;
- : 字串串列 = ["a"; “一種”; “一種”; “乙”;“乙”;“乙”;“C”; “C”; “C”]
- 復制 ["a"; “乙”;"c"] 3;;
- : 字串串列 = ["a"; “一種”; “一種”]
uj5u.com熱心網友回復:
在第二行
let rec h e n acc =
if n = 0 then f xs n acc
else h e (n-1) (e::acc)
in h x n acc
您正在呼叫f xs n acc
而n=0
不是n
.
作為一般建議,最好不要嵌套遞回函式定義。實際上,這限制了函式控制流的復雜性。例如,與
let rec repeated_append n x l =
if n = 0 then l
else repeated_append (n-1) x (x::l)
let replicate n l =
let rec replicate_aux n acc l =
match l with
| [] -> List.rev acc
| x::xs-> replicate_aux n (repeated_append n x acc) xs
in
replicate_aux n [] l
我保證遞回函式repeated_append
只replicate_append
在它們的體內呼叫自己。特別是,不可能h
呼叫replicate
或f
使函式更易于閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448935.html
下一篇:將遞回函式更改為尾遞回