何时递归?

当前层的需要使用下一层调用的结果,而且,各个层的调用之间满足一定的规律。我们可以使用递归算法。

递归算法的实现得以依赖于这种数据结构,栈的存在使得各层调用中的现场保护与恢复不需要人为干预。

递归算法的关键:

  1. 确定基线条件(使程序终止的条件)
  2. 确定递归条件(各层调用之间的规律)

例一:求1到100的和。

#include <stdio.h>

int sum(int x)
{
  if(x == 1) //基线条件
  {
    return 1;    
  }
  return sum(x-1) + x; //递归条件
}

int main()
{
  int ret = 0;
  ret = sum(100);
  printf("%d", ret);
  return 0;
}

用一个公式表达如下:

\[ sum(100) = 100 + sum(99) = 100 + 99 + sum(98) = ... = 100 + 99 + ... + 2 + sum(1) \]

计算机求解时,将\(sum(x)\)\(x\)从100到2)依次压入到栈中,直到\(x=1\)时,程序可以计算出\(sum(1) = 1\),弹出\(sum(1)\),然后将\(sum(1)\)的计算结果返回用于计算\(sum(2)\),当计算出\(sum(2)\)后,返回结果,弹出\(sum(2)\),...,最终,直到计算出\(sum(100)\),弹出\(sum(100)\),栈空结束。

猜你喜欢

转载自www.cnblogs.com/toooney/p/10991828.html