当前层的需要使用下一层调用的结果,而且,各个层的调用之间满足一定的规律。我们可以使用递归算法。
递归算法的实现得以依赖于栈这种数据结构,栈的存在使得各层调用中的现场保护与恢复不需要人为干预。
递归算法的关键:
- 确定基线条件(使程序终止的条件)
- 确定递归条件(各层调用之间的规律)
例一:求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)\),栈空结束。