F#如何循环从-1到1或1到-1?

时间:2014-04-02 07:01:46

标签: f#

我想要j = 1 .. j = -1和i = -1 .. i = 1之类的东西,我知道Java / C#的做法,但不是F#。

   for j in 1 .. -1 do
    for i in -1 .. 1 do
      //all 9 combination.

指导,谢谢你。

4 个答案:

答案 0 :(得分:8)

looping降为数字时,您可以使用downto关键字:

for j = 1 downto -1 do
  for i = -1 to 1 do

或者你可以在@Jaya的回答中使用for in范围语法。

答案 1 :(得分:5)

   for j in 1.. -1 .. -1 do
     for i in -1 .. 1 .. 1 do
        printf "%d , %d" i j

答案 2 :(得分:2)

Jaya和Phillip Trelford的答案都很好。如果你想要一系列所有组合而不是命令式循环,你可以这样做:

let combinations =
    [1 .. -1 .. -1]
    |> Seq.collect (fun i -> [-1 .. 1] |> Seq.map (fun j -> (i, j)))

这会生成这样的序列(转换为列表时):

[(1, -1); (1, 0); (1, 1); (0, -1); (0, 0); (0, 1); (-1, -1); (-1, 0); (-1, 1)]

如果您想要一个不同的顺序,您可以随时对元组进行排序,但以不同方式生成序列可能更有效。例如,如果您想要这个序列:

(-1,1) (0,1) (1,1) (-1,0) (0,0) (1,0) (-1,-1) (0,-1) (1,-1)

您可以简单地切换ij

let combinations =
    [1 .. -1 .. -1]
    |> Seq.collect (fun i -> [-1 .. 1] |> Seq.map (fun j -> (j, i)))

生成此序列(转换为列表以便于阅读):

[(-1, 1); (0, 1); (1, 1); (-1, 0); (0, 0); (1, 0); (-1, -1); (0, -1); (1, -1)]

答案 3 :(得分:1)

如果你真的只是计算-1,0,1,那么将它写出来可能会更清楚:

for j in [1; 0; -1] do
  for i in [-1; 0; 1] do
    printfn "%d,%d" i j