递归定义
一个函数直接或者间接调用自己
先来看一段写的很好的话
“当在一个函数运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:
(1)将所有的实参、返回地址等信息传递给被调函数保存
(2)为被调函数的局部变量分配存储区
(3)依照被调函数保存的返回地址将控制转移到调用函数
当有多个函数构成嵌套调用时,按照后调用先返回的原则,上述函数之间的信息传递和控制转移必须通过栈来实现,即系统将整个程序运行时所需要的的数据空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,每当一个函数退出时,就释放它的存储区,则当前正在运行的函数的数据区必在栈顶” ——《数据结构与算法》,严蔚敏
上面这句话适合于函数A调用函数B,同时函数A调用函数A【即递归】也是同样的道理
递归分类很多,可以通过例子去理解
递归的几个例子
例一:利用递归求 1+2+3+......+100的和
#include <stdio.h>
/*递归法求1+2+3+...+100啊*/
int f(int n)
{
if (n == 1)
return 1;
else
return f(n-1) + n;
}
int main(void)
{
printf("%d", f(100));
return 0;
}
例二:求阶乘(可以用循环写,也可以用递归写)
① 循环法求阶乘
#include <stdio.h>
/*循环法求阶乘*/
int f(int n)
{
int fac = 1;
int i;
if (n == 0)
return 0;
for (i = 1; i <= n; i++)
fac = fac * i;
return fac;
}
int main(void)
{
printf("%d", f(2));
return 0;
}
② 递归法求阶乘
#include <stdio.h>
/*递归法求阶乘啊*/
int f(int n)
{
if (n == 1)
return 1;
else
return f(n-1)*n;
}
int main(void)
{
printf("%d", f(4));
return 0;
}
例三:
汉诺塔问题
例四:
走迷宫