一般来说,我对F#和函数式编程非常陌生,我希望递归地创建一个函数,该函数接受一个列表,并将所有元素加倍。
这是我曾经搜索的一个spacific元素,但我不确定如何才能确切地更改它以满足我的需要。
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 )有什么办法让我增加这个能力去做我需要做的事吗?
发布于 2017-03-22 20:04:48
我想带你经历一下思考的过程。
步骤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) listhttps://stackoverflow.com/questions/42959749
复制相似问题