给定以下 C# 代码:
var product = new List<int>();
for (int n1 = 100; n1 < 1000; n1++)
{
for (int n2 = 100; n2 < 1000; n2++)
{
product.Add(n1 * n2);
}
}
以函数式风格编写的等效 F# 代码是什么?
给定以下 C# 代码:
var product = new List<int>();
for (int n1 = 100; n1 < 1000; n1++)
{
for (int n2 = 100; n2 < 1000; n2++)
{
product.Add(n1 * n2);
}
}
以函数式风格编写的等效 F# 代码是什么?
我会用for循环这样写。即使是 Haskell 程序员也可能会用列表理解来表达这一点,在这种情况下,您可以编写例如
let productsList =
[for x in 2..4 do
for y in 2..4 do
yield x*y]
在 F# 中。
Brian 建议的解决方案绝对是最好的选择(在 F# 中)。序列表达式为您提供了一种更简单的方式来表达您的意思,那么为什么不使用它们呢?
无论如何,如果您只是将其作为练习,那么您可以将嵌套循环重写为单个递归函数,将外部循环重写为第二个(如 Imagist 建议的那样):
let product =
let rec outer(n1) =
let rec nested(n2) =
if n2 > 4 then [] else (n1 * n2)::(nested(n2 + 1))
if n1 > 4 then [] else nested(2) @ outer(n1 + 1)
outer(2)
我在嵌套函数中使用 :: 将元素附加到开头,并使用 @ 来连接由各个嵌套函数调用生成的列表。@ 的使用效率不高,代码也不是尾递归的,所以使用 accumulator 参数的更好版本如下所示:
let product =
let rec outer n1 acc =
let rec nested n2 acc =
if n2 > 4 then acc else nested (n2 + 1) ((n1 * n2)::acc)
if n1 > 4 then acc else outer (n1 + 1) (nested 2 acc)
outer 2 [] |> List.rev
希望这可以帮助!