递归程序在执行时需要系统提供隐式栈这种数据结构来头现,对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法,利用栈消除递归过程的步骤如下。
(1)设置一个工作栈存放递归工作记录(包括实参、返回地址及局部变量等。

(2)进人非递归调用入口(即被调用程序开始处)将调用程序传来的实在参数和返回地址人栈
(3)进人递归调用入口:当不满足递归结束条件时,逐层递归,将实参、返回地址及局部变量入栈,这一过程可用循环语句来实现(模拟递归分解的过程)。
(4)递归结束条件满足,将到达递归出口的给定常数作为当前的函数值(模拟递归结束)。
(5)返回处理:在栈不空的情况下,反复退出栈顶记录,根据记录中的返回地址进行题意规定的操作,即逐层计算当前的数值,直全栈空为止(模拟递归求值过程)。
        通过以上步骤,可将任何何递归算法改与成非递归算法。但改与后的非递归算法和原来比较起来,结构不够清晰,可读性差,有的还需要经过一系列的优化。


例:利用栈实现非递归方式来计算递归函数:

F(n) = F(n-1)*n          n>1;

        =  1                    n=1;

先来分析一下阶乘的实现过程,需要一个隐形的栈进行控制:

初始输入n=3,由于n大于1,不满足结束条件,将n=3进行存储表示F(3)未计算

计算n=n-1,n=2>1,不满足结束条件,将n=2进行存储表示F(2)未计算

计算n=n-1,n=1,满足结束条件,F(1)=1完成计算

取出存储区域的2,并计算F(2)=F(1)*2=2

取出存储区域的3,并计算F(3)=F(2)*3=6

此时工作记录为空,计算完毕返回结果6

可见,计算阶乘时数据具有先进后出的特点,因此采用栈来实现其非递归过程

思路:(1)当n>1时重复执行将n压栈,然后n=n-1;

            (2)当n=1时,记录F=1(对应于F(1)=1);

            (3)重复执行当栈不为空时出栈,设栈顶元素为e,则更新:F=F*e;

#include <iostream>
using namespace std;
#define ERROR 0;
#define OK 1;
typedef int Status;//定义链栈
typedef struct StackNode {int data;struct StackNode *next;
} StackNode, *LinkStack;//初始化栈
Status InitStack(LinkStack &S) {S = NULL;return OK;
}//判断栈是否为空
int IsEmptyStack(LinkStack S) {if (S == NULL)return 1;elsereturn 0;
}//入栈
Status Push(LinkStack &S, int e) {StackNode *p = new StackNode;p->data = e;p->next = S;S = p;return OK;
}//出栈
Status Pop(LinkStack &S, int &e) {if (S == NULL)return ERROR;e = S->data;StackNode *p = S;S = S->next;delete p;return OK;
}int main () {int n, e;int F = 1;cin >> n;LinkStack S;InitStack(S);cout << "F(" << n << ")=";while (n) {            //当n>1时重复执行将n压栈,然后n=n-1;Push(S, n);n--;}while (!IsEmptyStack(S)) {Pop(S, e);if (n == 1)      F = 1;         //当n=1时,记录F=1elseF = F * e;     //重复执行当栈不为空时出栈,设栈顶元素为e,则更新:F=F*e}cout << F;return 0;
}

运行结果如下:

利用栈实现递归函数的非递归计算(非递归求阶乘)相关推荐

  1. 利用栈实现递归函数的非递归计算

    题目:利用栈实现以下递归函数的非递归计算 分析:         这里我们需要使用栈的先进后出特性.我们可以看出,从n=2开始,每一个值便都与前两个值挂钩,且式子不变,我们可以从栈顶到栈底依次边出栈边 ...

  2. 图解利用栈实现递归函数的非递归计算

    例题 一开始我看网上说的是要模拟实际函数调用堆栈的行为 然后我就一直在想怎么模拟 比如我一开始想的是 n n-1 n-2 n-1 n-3 n-4 n-1 n-3 n-5 n-6 这样 但是我不知道怎么 ...

  3. 【Java】利用递归求阶乘

    package LearnJava9;import java.util.Scanner;public class diguiDemo2 {public static void main(String[ ...

  4. python 利用递归求阶乘

    代码如下 def fac(n):if n==1 or n==0:return 1else:return fac(n-1)*nprint(fac(5)) #120

  5. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  6. 数据结构:利用栈,将递归转换为非递归的方法

    利用栈将递归转换为非递归 对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化,可直接写出相应的非递归算法. 步骤 第一次调用的参数push进堆栈,原有递归代码外层加一个while循环,判断 ...

  7. 使用栈将递归函数转化为非递归函数_栈(Stack)及其应用-Python实现

    常见数据结构的Python实现-栈 目录 1.1 基本概念 1.2 栈的实现 1.3 应用(括号匹配) 1.4 应用(中缀转后缀-整数) 1.5 应用( 中缀转后缀-浮点数) 1) 拆分表达式 2) ...

  8. 利用栈将递归转换为非递归的方法

    通过上述讨论,可以看出递归程序在执行时需要系统提供隐式栈这种数据结构来实现,对于 一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法. 这种利用栈消除递归过程的步骤如 ...

  9. 怎么用vc采集ni卡数据_利用labview、matlab和c实现非ni接口卡的数据采集及处理

    利用LabVIEW .MATLAB 和C 实现非NI 接口卡的数据采集及处理** 周旭欣1 董兵超1 向明礼2 李拥秋1 袁支润1? (1.四川大学生物力学研究所,成都:610065:2.四川大学化工 ...

最新文章

  1. 【转载】反向代理为何叫反向代理?
  2. .NET操作注册表的封装类
  3. 京瓷2010复印a4内容不全_京瓷2010复印机,纸卡定影的故障
  4. pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件
  5. css的一些常见问题处理方法
  6. 【转】如何在Qt 4程序中优化布局结构-兼回答网友提问
  7. vue3开启eslint之后报错:error Parsing error: ‘>‘ expected
  8. 如何管理员工工时表?
  9. Python - 爬虫 - 调用高德API案例
  10. java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室
  11. 极智装修知识|如何将效果图转化为实景的家? - 分享3
  12. VMware ESXi 扩容后提示“无法打开虚拟机的电源,请确认该虚拟磁盘是适用“厚”选项创建的”等信息,执行VMDK 格式是 zeroedthick 还是 eagerzeroedthick
  13. 第1章 linux的历史演绎
  14. Java语言程序设计与数据结构(基础篇)梁勇第二章书中例题
  15. java怎么实现发布说说_仿QQ发表说说
  16. WRO机器人奥林匹克(大赛系列第8期)
  17. SAP中物料状态不允许操作全控制测试记录
  18. put命令here are 2 datanode(s) running and 2 node(s) are excluded in this operation.的解决方法
  19. 小萌库 - 2014世界足球杯全程精彩回顾
  20. AlibabaProtect.exe如何删除、卸载

热门文章

  1. Inkscape裁剪图片(pdf,svg,png,jpg)
  2. 回收站中清空的文件如何恢复
  3. android 缩放回弹动画,Android自定义ScrollView实现放大回弹效果实例代码
  4. 海量卫星影像数据交付中遇到过的那些坑(硬盘篇)
  5. 叶绿体基因组核酸多态性(Pi)分析
  6. 自己动手写CPU(7)流水线暂停机制+乘累加累减+除法指令
  7. Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)
  8. 2018年第二届机械工程与应用复合材料国际会议(MEACM2018)
  9. miniPCIe标准
  10. 全球与中国汽车USB充电器市场深度研究分析报告