我对F#和函数式编程非常陌生,并希望以递归方式创建一个获取列表的函数,并将所有元素加倍。
这是我用来搜索空间元素的东西,但我不知道我究竟能如何改变它来做我需要的东西。
let rec returnN n theList =
match n, theList with
| 0, (head::_) -> head
| _, (_::theList') -> returnN (n - 1) theList'
| _, [] -> invalidArg "n" "n is larger then list length"
let list1 = [5; 10; 15; 20; 50; 25; 30]
printfn "%d" (returnN 3 list1 )
有没有办法让我增加这个来做我需要的东西?
答案 0 :(得分:8)
我想带你完成思考过程。
第1步。我需要一个递归函数,它接受一个列表并将所有元素加倍:
所以,让我们以一种天真的方式实现这一点:
let rec doubleAll list =
match list with
| [] -> []
| hd :: tl -> hd * 2 :: doubleAll tl
希望这个逻辑非常简单:
如果我们有一个空列表,我们会返回另一个空列表。
如果我们有一个包含至少一个元素的列表,我们将该元素加倍,然后将其添加到在列表尾部调用doubleAll
函数的结果。
第2步。实际上,这里有两件事:
所以,现在我们有两个功能,让我们做一个简单的实现:
let rec map f list =
match list with
| [] -> []
| hd :: tl -> f hd :: map f tl
let doubleAll list = map (fun x -> x * 2) list
第3步。实际上,map
的想法是如此常见,它已经内置到F#标准库中,请参阅List.map
所以,我们需要做的就是:
let doubleAll list = List.map (fun x -> x * 2) list