递归

来源:互联网 发布:js根据下标删除数组 编辑:程序博客网 时间:2024/04/27 21:46
直接或间接调用自己的函数称为递归函数。一个简单的递归函数例子是阶乘的计算。数 n 阶乘是从 1 到 n 的乘积。例如,5 的阶乘就是 120。

  1 * 2 * 3 * 4 * 5 = 120

解决这个问题的自然方法就是递归:

  // calculate val!, which is 1*2 *3 ... * val
  int factorial(int val)
  {
  if (val > 1)
  return factorial(val-1) * val;
  return 1;
  }

递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽。有时候,这种现象称为“无限递归错误”。对于函数 factorial,val 为 1 是终止条件。

另一个例子是求最大公约数的递归函数:

  // recursive version greatest common divisor program
  int rgcd(int v1, int v2)
  {
  if (v2 != 0) // we're done once v2 gets to zero
  return rgcd(v2, v1%v2); // recurse, reducing v2 on each call
  return v1;
  }

这个例子中,终止条件是余数为 0。如果用实参 (15, 123) 来调用 rgcd 函数,结果为 3。

rgcd(15, 123) 的跟踪过程
v1 v2 Return
 
15 123 rgcd(123, 15)
 
123 15 rgcd(15, 3)
 
15 3 rgcd(3, 0)
 
3 0 3
 
最后一次调用:

  rgcd(3,0)