功能编程打印数字可被2整除

时间:2019-02-27 16:57:48

标签: c# functional-programming

我正在尝试学习函数式编程,并且正在编写一个打印可除数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);
        }
    } 

1 个答案:

答案 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的同一实例的内部状态。