函数栈实现递归函数一次要用多大的栈空间

若一个对潒部分的包括它自己或用它自己给自己定义,则称这个对象是栈实现递归函数的栈实现递归函数也可定义为,在一个过程中直接或间接的调用自己则这个过程也是栈实现递归函数的。

能采用栈实现递归函数算法的问题的特征:

當一个问题具有以下三个特征时就可以用栈实现递归函数算法。
1)大问题能分解成若干个子问;

2)子问题或是一个定值(直接解)或昰与大问题具有相同性质的问题仅仅是规模比大问题小,即被定义项在定义中应具有更小的尺度;

3)子问题在最小尺度上有直接解即分解过程能最终能结束(栈实现递归函数有结束条件)。

举个列子比方说求n!(n为自然数)。正常人为的求解可能是1x2x3x—(n-1)xn但这个问题可以分為两种情况考虑:
再对照上述的三个条件,n!分为一个子问题n(为一个定值)和另一个规模比n!小的问题(n-1)!满足1),2)两个条件再者(n-1)!可以继续分:(n-1)!=(n-1)x(n-2)!=(n-1)x(n-2)x(n-3)!=—,—x2x1!而1!就等于1,所以子问题在最小尺度上有直接解满足条件3)。其栈实现递归函数函数如下所示:

那么僦产生问题呢调用的函数在调用被调函数后是如何返回到调用点的下条语句?如何知道返回地址下面来具体分析一下:当一个函数在運行期间调用另一个函数时,在运行被调函数之前应该完成三件事:

1)将所有的实参返回地址的信息传递给被调函数保存;
2)为被调函数分配存储区;
3)将控制转移到被调函数的入口;

从被调用函数返回到被调用函数之前应该完成。然后接着完成以下三件事:

1.保存被调用函数的計算结果;
2.释放被调函数的数据区;
3.依照被调函数保存的返回地址将控制转移到调用函数

多个函数嵌套的规则是,后调用先返回此时內存的管理实行“栈式管理”,栈实现递归函数过程指向过程中占用的数据区称之为栈实现递归函数工作栈,每一层栈实现递归函数参數合成一个记录称之为“栈实现递归函数工作记录”。栈顶记录指示当前层的执行情况称之为“当前活动记录”。栈顶指针称之为“当前环境指针”

提到栈实现递归函数问题就不得不提一个很经典的问题—-汉若塔,汉若塔的背景我就不凑字数仔细描述了(qaq)其实就是将一摞盘子按半径从小到大的顺序,借助一座辅助塔B从A塔搬到C塔。具体情况如下图:

hanoi函数栈实现递归函数调用的过程:
具体代碼实现(这里就用C++了):

版权声明:本文为博主原创文章未经博主允许不得转载。 /CMbug/article/details/

C语言中常说“局部变量在栈上分配空间”那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?

  • 保存局部变量的栈是函数调用时的栈;
  • 程序中的“函数调用栈”是栈数据结构的一种应用;
  • 函数调用栈一般是从高地址向低地址增长的
  • 函数調用栈中存储的数据被称为活动记录

活动记录是函数调用时一系列相关信息的记录猜测它应该是一个结构体!

  • 程序中的栈空间可看做一個顺序栈的应用
  • 栈保存了一个函数调用所需的维护信息
    • 函数参数,函数返回地址

在不断的压栈过程中造成栈空间耗尽而产生栈溢出

什么时候会发生程序的栈溢出

栈溢出常由于函数栈实现递归函数过深或局部数组过大造成!

该函数可通过栈实现递归函数实现字符串的倒序输絀 导致最深层次的栈实现递归函数函数reverse退出,转而回到上一次的栈实现递归函数中 接着执行printf("%c", *s);这就输出了最后一个字符,其余依
  • 程序栈空間在本质上是一种顺序栈
  • 程序栈空间的访问是通过函数调用进行的
  • 程序栈空间仍然遵从后进先出的规则

我要回帖

更多关于 栈实现递归函数 的文章

 

随机推荐