gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:23:46 24 4
gpt4 key购买 nike

我有一个函数,我想将 float 列表转换为另一个 float 列表,对于每个元素,我希望将 x% 的元素溢出到元素 i + 1

示例:

let p3 = [0.1; 0.2; 0.4; 0.2; 0.1]

那么 p3_s 应该是:

[0.05; 0.15; 0.3; 0.3; 0.2]

为此,我取了每个元素的一半并将其添加到下一个元素中。

  • 0.1 变成了 0.05,因为它给了下一个 0.05,没有前一个元素
  • 0.2 变成了 0.15,因为它把 0.1 给了下一个,然后得到了 0.05第一个
  • 最后 0.1 变成了 0.2,因为它是 0.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

现在回答问题:

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

但这不会将 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)

此外,这只需要一次遍历列表,而不是 Ramon 解决方案中的 3 次,并且临时存储更少。

关于list - 将不同的函数映射到列表中的第一个和最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7633441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com