栈还有一个重要的应用时在程序设计语言中实现递归。
一个直接调用自己或者通过一系列的调用语句间接的调用自己的函数,称作递归函数。
递归是程序设计中的一个强有力的工具。
其一:有许多数学函数式递归的,如f(n)=n*f(n-1)
其二:有的数据结构,如二叉树,广义表等,由于结构本身固有的递归特性,则他们的操作可递归的描述;
其三:还有一类问题,虽然问题本身没有明显的递归结构,单用递归求解比迭代求解更简单,如八皇后问题、hanoi塔等问题。
/* algo3-8.c 用递归调用求Ackerman(m,n)的值 */
#include<stdio.h>
int ack(int m,int n)
{
int z;
if(m==0) /* 出口 */
z=n+1;
else if(n==0)
z=ack(m-1,1); /* 对形参m降阶 */
else
z=ack(m-1,ack(m,n-1)); /* 对形参m、n降阶 */
return z;
}
void main()
{
int m,n;
printf("Please input m,n:");
scanf("%d,%d",&m,&n);
printf("Ack(%d,%d)=%d\n",m,n,ack(m,n));
}
运行:
[root@localhost algorithm]# ./algo3-8
Please input m,n:2,2
3
3
4
5
5
3
4
5
6
7
7
Ack(2,2)=7
[root@localhost algorithm]#