将不同的函数映射到列表中的第一个和最后一个元

gjv*_*amp 3 f# list

我有一个函数,我想将一个浮点数列表转换为另一个浮点数,其中每个元素我想要有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)

为此,我将每个元素的一半添加到下一个元素中.

  • 0.1变为0.05,因为它给下一个0.05,没有先前的元素
  • 0.2变为0.15,因为它给下一个0.1,从第一个得到0.05
  • 等等
  • 最后0.1变为0.2,因为它来自前一个.01.没有下一个元素.

现在我想出了这个,但只适用于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#还很新鲜,还有很多我还不知道的事情.猜测这里的一般情况是:如何将不同的函数映射到列表的第一个和最后一个元素,将一个函数映射到其他元素?

提前致谢,

格特 - 扬

Joh*_*mer 5

这是一个更实用的解决方案

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,以及较少的临时存储.