递归与简单的栈

一、递归

递归:是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象 通俗来说就是一个函数不断地调用自己的过程,直到调用到已知的自己。 优点:使用递归解决问题,思路清晰,代码少。 以C语言经典题目斐波那契数列为例,用递归将其实现

源代码:

#include <stdio.h>

int Fibona(int n)
{
	if(n==1||n==2)
	{
		return 1;
	}
	else
	{
		return Fibona(n-1) + Fibona(n-2);
	}
}

int main()
{
	for(int i=1;i<=10;i++)
	{
		printf("%d\n",Fibona(i));
	}
	return 0;
}

上面所附的源代码即实现简单的斐波那契数列,我们可以看出用递归的方式确实简洁,代码少。

二、递归与栈

在说到递归的内部实现的时候我们就不得不说到栈。
栈:是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。
基本来说栈的基本规则就是:先进后出,后进先出。
在递归运行时,当还没运行到已知的自身函数时就会不停的调用自己,而在不断调用的过程中那些没有运行完的函数就会存在栈中
如下图:递归入栈

在这里插入图片描述
将自己不断地存入栈中,直到调用到了已知的自身便不断地将所得到的值返回上一个未运行结束的函数,直到返还给main函数。
用栈来说就是存入和释放的过程。
如图:递归出栈

在这里插入图片描述
但其实递归是一种耗费空间大,运行时间久的算法,且运算的范围很有限。
之所以有限,是因为栈的大小近似于1M,而递归不断地将未运行完的函数不断存入,数据小还勉强可以,一旦数据比较大就会将栈给挤爆,所以在写算法时尽量避免递归的使用。

发布了18 篇原创文章 · 获赞 0 · 访问量 686

猜你喜欢

转载自blog.csdn.net/wfea_lff/article/details/101530078