2.2.3 用递归改变程序状态

现实世界的函数编程:有 F# 和 C# 示例 1-02-02-3

2.2.3 用递归改变程序状态

现在,让我们看看如何编写更复杂的函数使用的值。我们会实现一个函数,对指定范围内的数字求和。我们可以求和,但我们会将其用作示例使用循环的计算。(在 2.3.1 中,我们会向你展示如何更改此代码成为更普遍有用的函数。)

int SumNumbers(int from, int to) {
int res = 0;
for (int i = from; i <= to; i++)
res = res + i;
return res;
}

这里,我们不能直接用值绑定替换变量,因为我们要在每个循环计算时修改这个值。该程序必须保持某一状态,在每次循环迭代更改其状态。这意味着,像我们所做的那样,我们对每次状态更改不能声明新的值,如我们在早先的示例中做的一样。我们需要在代码中作出根本的改变,使用叫“递归”的方法,而不是使用循环:

int SumNumbers(int from, int to) {
if (from > to) return 0;
int sumRest = SumNumbers(from + 1, to);
return from + sumRest;
}

如你所知,递归意味着函数(这里,SumNumbers)调用自身——这里,是在我们计算 sumRest 变量的值的时候。这是此代码中唯一使用的值绑定,因此,这是一个纯函数。计算的状态,它最初保存在可变的变量中,现在使用递归表示。当我们第一次提到不能为每次状态改变而声明新变量的时候,从某种意义说,这是不正确的,因为这是新的递归实现所做的。每次函数以递归方式调用自身,它将跳过第一数字,计算的剩余的数字的和,这一结果绑定到变量 sumRest,在每次执行递归函数的过程中,被声明为一个新的变量。

每次写的计算的递归部分是困难的,所以,函数语言提供了一种方法,隐藏了“困难的”递归部分,不使用显式的递归表示大多数问题。在 2.3.1 节,我们会回到这个主题,在完成函数程序中的计算的讨论之后。

你可能感兴趣的:(F#,C#,职场,休闲,函数编程)