我有一个函数,我想将一个浮点数列表转换为另一个浮点数,其中每个元素我想要有x%的元素我溢出到元素i + 1
例:
let p3 = [0.1; 0.2; 0.4; 0.2; 0.1]
Run Code Online (Sandbox Code Playgroud)
那么p3_s应该是:
[0.05; 0.15; 0.3; 0.3; 0.2]
Run Code Online (Sandbox Code Playgroud)
为此,我将每个元素的一半添加到下一个元素中.
现在我想出了这个,但只适用于5号列表:
// create list
let p3 = [0.1; 0.2; 0.4; 0.2; 0.1]
let shiftList orgList shift =
// chop list up in tuples of what stays and what moves
let ms = orgList |> List.map (fun p-> (p * shift, p * (1.0-shift)))
// map new list
ms |> List.mapi (fun i (move, stay) ->
match i with
| 0 -> stay
| 4 -> stay + fst ms.[i-1] + move // note hardcoded 4
| _ -> stay + fst ms.[i-1])
// get shifted list
shiftList p3 0.5
Run Code Online (Sandbox Code Playgroud)
现在提问:
1)如何在任何长度列表上匹配?现在我在匹配表达式中对4进行了硬编码,但我希望能够接受任何长度列表.
我试过这个:
let shiftList orgList shift =
// chop list up in tuples of what stays and what moves
let ms = orgList |> List.map (fun p-> (p * shift, p * (1.0-shift)))
// find length
let last = orgList.Length - 1
// map new list
ms |> List.mapi (fun i (move, stay) ->
match i with
| 0 -> stay
| last -> stay + fst ms.[i-1] + move
| _ -> stay + fst ms.[i-1]) // now this one will never be matched
Run Code Online (Sandbox Code Playgroud)
但是这不会被last视为数字4,而是变成了变量,i即使last已经在上面声明了.
那么我如何才能匹配一个变量,以便我可以区别对待最后一个?找到第一个很容易,因为它是0.
2)你会怎么做?我对F#还很新鲜,还有很多我还不知道的事情.猜测这里的一般情况是:如何将不同的函数映射到列表的第一个和最后一个元素,将一个函数映射到其他元素?
提前致谢,
格特 - 扬
这是一个更实用的解决方案
let func (input:float list) =
let rec middle_end input_ =
match input_ with
|h::t::[] -> ((h/2.0)+t)::[]
|h::t::tt ->((h+t)/2.0)::(middle_end (t::tt))
| _ -> [] //fix short lists
let fst = input.Head/2.0
fst::middle_end(input)
Run Code Online (Sandbox Code Playgroud)
此外,这只需要单次通过列表,而不是Ramon的解决方案中的3,以及较少的临时存储.
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |