我正在尝试学习函数式编程,并且正在编写一个打印可除数2的数字的函数。我知道在函数式编程中它应该避免循环并且应该具有引用透明性,因此变量应该是不可变的。这是我写的函数,这是否适合函数式编程范例?
public static void evenNumbers(int start, int end)
{
if (start <= 20)
{
if (start % 2 == 0)
{
System.Console.WriteLine(start);
}
evenNumbers(start + 1, end);
}
}
编辑,我对代码做了一些更改
public static void evenNumbers(int start, int end)
{
if (start <= 20)
{
if (start % 2 == 0)
{
return start;
}
evenNumbers(start + 1, end);
}
}
答案 0 :(得分:2)
如果要在c#中编写“功能”代码-使用LINQ扩展方法
var valuesToPrint =
Enumerable.Range(start, end - start)
.Where(value => number % 2 == 0)
.Select(value => value.ToString());
var output = String.Join(Environment.NewLine, valuesToPrint)
// Console is external resource (aka global state)
Console.WriteLine(output);
如果您是LINQ的忠实拥护者,则可以使用.Aggregate
扩展方法构建输出
var output =
Enumerable.Range(start, end - start)
.Where(value => number % 2 == 0)
.Aggregate(new StringBuilder(),
(builder, value) => builder.AppendLine(value),
builder => builder.ToString());
Console.Write(output);
有些人会争论Aggregate
并不是纯粹的功能,因为我们会更新StringBuilder
的同一实例的内部状态。