是否可以重复数组?

时间:2018-11-07 09:00:08

标签: f#

我需要向数组中的每个元素加1,如果超出范围,则需要重新开始。

let arr = [| 1; 2; 3 |]

for i = 0 to Array.length arr - 1 do

    arr.[i] <- arr.[i] + 1
    printfn "i %A" (arr.[i])

我想向数组添加5个点,以便在数组上进行迭代并在每个元素中给出一个点,因此数组将部分为[|。 2; 3; 4 |]并再次遍历数组,最后是arr = [| 3; 4; 4 |]

3 个答案:

答案 0 :(得分:2)

实际上,您可以精确计算应向数组的每个元素添加的数量。因此,您只需一次遍历数组即可解决该问题。

let addPoints arr points =
    let len = arr |> Array.length
    let added = points / len
    let extraCount = points % len
    arr
    |> Array.mapi (fun i x ->
        if i < extraCount then x + added + 1
        else x + added)

addPoints [| 1; 2; 3 |] 5
|> printfn "%A" // [|3; 4; 4|]

是否更改数组取决于您。

答案 1 :(得分:1)

一种比较惯用的F#方法是使用新计算的结果创建一个新数组,而不是对数组进行变异。您可以使用内置的Array.map函数对数组的每个元素进行相同的转换。要全部加一,您可以编写:

let arr = [| 1; 2; 3 |]
arr |> Array.map (fun v -> v + 1)

如果您想将最大值限制为4,则需要在函数主体中进行操作,即v + 1。为了使重复操作更加容易,定义一个函数很有帮助。

let step arr = 
  arr |> Array.map (fun v -> min 4 (v + 1))

在这里,step是一个您可以调用以执行转换步骤的函数。 min 4 (v + 1)确保当v + 1大于4时,结果只有4。现在,您可以使用step重复运行|>

let arr1 = arr |> step
let arr2 = arr |> step |> step

答案 2 :(得分:1)

我同意@TomasPetricek的观点,方法是使用map创建新的数组。但是,如果必须对数组进行突变,则以下基于循环的方法应该可以正常工作:

let incArrayElements n (a : _ []) =
    let rec loop k i =
        if k > 0 then
            a.[i] <- a.[i] + 1
            let ii = i + 1
            if ii >= a.Length then 0 else ii
            |> loop (k - 1)
    if n > 0 then loop n 0

如果需要,也可以轻松地对其进行修改,以包含用于起始索引的参数。