我需要向数组中的每个元素加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 |]
答案 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
如果需要,也可以轻松地对其进行修改,以包含用于起始索引的参数。