栈在递归算法的内部实现中所起的作用|栈与递归

采用递归算法解决的问题

定义是递归的

//阶乘的函数定义
long Fact(int n)
{
	if(n==1) return 1;
	else return n*Fact(n-1);
}

对于一类复杂的问题,能够分解成几个相对简单,解法相同或类似的子问题来求解,便称为递归求解。
这种分解-求解的策略叫“分治法”

  1. 能够通过转变将问题变成一个与原问题相类似的问题
  2. 通过分治法简化问题
  3. 必须有一个明确的递归出口

数据结构是递归的

链表就是一种递归的数据结构

遍历输出链表中各个结点的递归算法

void TraverseList(LinkList p)
{
	if(p==NULL) return;
	else
	{
		cout << p->data<<endl;
		TraverseList(p->next);
	}
}

广义表、二叉树也是典型的具有递归特性的数据结构

递归过程与递归的工作栈

两个函数相互调用时

调用前:

  • 将所有的实参、返回地址、等信息传递给被调函数来保存
  • 为被调函数的局部变量分配存储区
  • 将控制转移到被调函数入口

调用后:

  • 保存被调函数的计算结果
  • 释放被调函数的数据区
  • 依照被调函数的返回地址将控制转移到调用函数上

当有多个函数构成嵌套调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须通过栈来实现,即系统将整个程序运行时所需要的数据空间安排在一个栈中,每次调用一个函数时,就为他在栈顶分配一个存储区,每当一个函数退出时,就释放它的存储区,则当前正运行的函数的数据必须在栈顶。

空间复杂度的分析
递归函数在执行时,系统需要设立一个递归工作栈,存储每一层递归所需要的信息,此工作栈是递归函数执行的辅助空间,分析空间复杂度时需要分析工作栈的大小。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值