现在,我们来写一此更复杂的函数,看看如何使用值。我们实现的函数,是求指定范围内的数字的和。当然你可以直接计算出和,但我们是把它作为使用循环进行计算的示例。(在 2.3.1 节,我们会把代码改成更通用的函数。)
int SumNumbers(int from, int to) {
intres = 0;
for(int i = from; i <= to; i++)
res= res + i;
returnres;
}
这里,我们不能直接用值绑定替换变量,因为每次循环过程中都要修改这个值。程序必须保持一定的状态,其状态在每次循环迭代时改变。这就是说,我们不能像在前面示例中所做的那样,为每次状态改变声明一个新的值;而需要对代码作根本性的改变,使用一种叫“递归(recursion)”的方法,来代替循环:
int SumNumbers(int from, int to) {
if(from > to) return 0;
intsumRest = SumNumbers(from + 1, to);
returnfrom + sumRest;
}
如你所知,递归意味着函数(这里的SumNumbers)调用自身,在这里,是计算 sumRest 变量的值。在这段代码中,我们只用到了值绑定,因此,这是纯函数式的。计算的状态,最初是保存在可变的变量中,现在用递归表示。当我们第一次提到不能为每次状态改变而声明新变量的时候,从某种意义上说,这是不正确的,因为这就是新的递归实现所做的。函数每次递归调用自己,将跳过前面的数,计算其余的数字的和,其结果绑定到变量 sumRest,这就是在每次递归函数执行过程中,声明的新变量。
如何写出每次递归计算的内容是困难的,所以,函数语言提供了一种方法,“隐藏了”递归的困难部分,不需要显式使用递归就能表示大多数问题。在 2.3.1 节,讨论完成函数程序中的计算之后,我们还会回到这个主题。
2.2.3 用递归改变程序状态