首页 > 代码库 > 2.2.3 用递归改变程序状态

2.2.3 用递归改变程序状态

2.2.3 用递归改变程序状态

 

现在,我们来写一此更复杂的函数,看看如何使用值。我们实现的函数,是求指定范围内的数字的和。当然你可以直接计算出和,但我们是把它作为使用循环进行计算的示例。(在 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 节,讨论完成函数程序中的计算之后,我们还会回到这个主题。