递归转非递归(学习笔记)

原创 2006年05月28日 17:10:00

在网上逛的时候发现一篇好文 递归转非递归 ,阅读完,觉得有启发,把重点记录下来,另外作者是用ISO C++语言描述的,我在测试的时候把它改成C#2.0的拉:

为什么要递归转非递归:
因为每一次的递归调用都需要压栈占用内存,效率不高.

递归转非递归的两种方法:
下面以求n的阶乘来说明
先给出一般的递归方法:


 1        /// <summary>
 2        /// 递归求阶乘
 3        /// </summary>

 4        private int Factorial(int n)
 5        
{
 6            if (n > 1
)
 7            
{
 8                return n * Factorial(n - 1
);
 9            }

10            else if (n == 1)
11            
{
12                return 1
;
13            }

14            else
15            {
16                throw new ArgumentException("Argument Error"
);
17            }

18        }

非递归方法一:循环法,前提是,待解决问题必须能够分解出可循环规律方可
而n! = n! = n*(n-1)*(n-2)*....*1;从循环的角度理解就是:n!表示执行n次循环计算一个增量k,初始k=1和结果t=1;每次t乘以k++的值.从而可以得到:

 1        /// <summary>
 2        /// 循环求阶乘
 3        /// </summary>

 4        private int FactorialByLoop(int n)
 5        
{
 6            int k = 1
;
 7            int t = 1
;
 8            while (k <=
 n)
 9            
{
10                t *=
 k;
11                k++
;
12            }

13
14            return
 t;
15        }

非递归方法二:自定义堆栈法,目的是为不能分析出来循环的递归操作提供开销可控的方法.如:

 1        /// <summary>
 2        /// 自定义堆栈求阶乘
 3        /// </summary>

 4        private int FactorialByStack(int n)
 5        
{
 6            Stack<int> s = new Stack<int>
();
 7            int t = 1
;
 8            int
 temp;
 9
            s.Push(n);
10            while ((temp = s.Peek()) != 1
)
11            
{
12                t *=
 s.Peek();
13
                s.Pop();
14                s.Push(temp - 1
);
15            }

16            return t;
17        }

说明:以上代码在Visual Studio 2005 Express中测试通过.
http://kwklover.cnblogs.com/archive/2006/04/08/369923.html

将递归函数转换为非递归形式

任何递归函数转换为非递归函数有一套固定的规则,使用该规则可以将任何递归函数转换为非递归函数。...
  • sunny_ss12
  • sunny_ss12
  • 2015年07月28日 01:39
  • 2828

递归与非递归的转变

一、什么是递归 递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了。 二、递归的几个特...
  • d2457638978
  • d2457638978
  • 2015年11月23日 14:00
  • 1582

用栈将递归转化为非递归

在竞赛中如果系统栈很小的话,过深的递归会让栈溢出,这个时候我们就要自己手写栈,将递归转化成手工栈。 方法其实也很简单。 基本思路上,我们就是用栈不断的pop,push。但是何时push,何时pop...
  • u012139398
  • u012139398
  • 2015年03月16日 08:40
  • 1135

递归与非递归转换

 递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。一、为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持...
  • liyan622
  • liyan622
  • 2009年11月26日 10:15
  • 1303

递归转非递归几个实例

递归是程序设计中很重要的技巧,简单易于实现;但递归程序效率较之非递归低得多,递归函数要直接或间接的调用自身,系统栈要频繁操作,时间空间消耗很大。在要求高效的很多场合需要将递归程序改写成非递归程序,由于...
  • xj2419174554
  • xj2419174554
  • 2014年05月27日 22:58
  • 933

递归程序转换成非递归程序的一般方法

一、递归函数的原理          用栈保存未完成的工作,在适当的时候从栈中取出并执行。 系统保存了工作的数据和状态,数据就是函数的局部变量, 状态就是程序指针。     二、 非递归程序原理...
  • qianyu668899
  • qianyu668899
  • 2013年03月18日 09:51
  • 1106

递归转换成非递归思路

问题: 非常经典的问题,将一个二叉树遍历,前序,中序,后序遍历由递归转换成非递归。 分析: 递归转换成非递归,一般解法是自己使用栈去模拟递归过程,首先我们来看下后序遍历递归解法: void p...
  • lxmky
  • lxmky
  • 2012年10月14日 12:54
  • 5773

斐波那契数列的递归和非递归实现 —— python

# -*- coding:utf-8 -*- #递归实现 def Fibonacci(n): if n
  • Yeoman92
  • Yeoman92
  • 2017年09月06日 23:22
  • 343

递归转非递归学习二:求斐波那契数列F(N)的值

上《数据结构》的网络课程学习了递归转非递归的机械式转换的方法之后, 先练习写了N的阶乘方法转非递归(模拟栈)的代码,然后试着将斐波那契数列求F(N)的值的过程(模拟栈)转化为非递归: #include...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2013年11月28日 18:06
  • 1051

归并排序 递归版和非递归版的实现(java)

基于最近笔试遇到听多次 归并排序,今天做了如下总结(有递归版和非递归版的) 实现思路:将待排序的序列分为若干个,每次两两合并,然后再把有序子序列合并为整体有序序列。 递归排序合并的思路 1)初始化...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年05月01日 22:57
  • 1638
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归转非递归(学习笔记)
举报原因:
原因补充:

(最多只允许输入30个字)