2.5 数据结构与算法之——递归专题【待更新】

递归定义

一个函数直接或者间接调用自己

先来看一段写的很好的话


“当在一个函数运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:

(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;
}

例三:

汉诺塔问题

例四:

走迷宫

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_43450646/article/details/107480086
2.5