F# - 复制列表的递归函数
F# - Recursive function to copy a list
我写了这段代码来递归复制我的列表:
let sp = [2;4;6;8;10]
let copy (s1:'a list) =
let rec copy acc ind =
if(ind>=0) then
copy (s1.[ind]::acc) (ind-1)
else acc
copy [] (s1.Length-1)
sp |> copy |> printfn "%A"
如何使这段代码更简单?
对列表执行查找(以及获取列表的长度)效率不是很高,因为库需要遍历整个列表(或前 N 个元素)。因此,在 F# 中这样做并不是真正的惯用做法。
您仍然可以保留代码的大部分结构,但像这样稍微改变一下:
let copy input =
let rec copy acc input =
match input with
| [] -> List.rev acc
| x::xs -> copy (x::acc) xs
copy [] input
变化是:
- 我们对输入使用模式匹配,总是得到第一个元素
- 因为我们以相反的顺序将项目附加到
acc
,所以我们调用 List.rev
来反转最后的结果(这是使用列表时的标准技巧)
我写了这段代码来递归复制我的列表:
let sp = [2;4;6;8;10]
let copy (s1:'a list) =
let rec copy acc ind =
if(ind>=0) then
copy (s1.[ind]::acc) (ind-1)
else acc
copy [] (s1.Length-1)
sp |> copy |> printfn "%A"
如何使这段代码更简单?
对列表执行查找(以及获取列表的长度)效率不是很高,因为库需要遍历整个列表(或前 N 个元素)。因此,在 F# 中这样做并不是真正的惯用做法。
您仍然可以保留代码的大部分结构,但像这样稍微改变一下:
let copy input =
let rec copy acc input =
match input with
| [] -> List.rev acc
| x::xs -> copy (x::acc) xs
copy [] input
变化是:
- 我们对输入使用模式匹配,总是得到第一个元素
- 因为我们以相反的顺序将项目附加到
acc
,所以我们调用List.rev
来反转最后的结果(这是使用列表时的标准技巧)