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

原创 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

非递归版本KM算法学习笔记

KM算法的思想在于,如最大权匹配,给出一个二分图,在左右两边的点上都记一个顶标,左边AiA_i,右边BiB_i,时刻保证Ai+BI≥Wi,jA_i+B_I≥W_{i,j},当增广路算法结束之后,我们可...

数据结构学习笔记1-链表反转(递归与非递归)

最近在学习数据结构,做下笔记:

数据结构与算法分析笔记与总结(java实现)--二叉树2:非递归二叉树的序列打印练习题

数据结构与算法分析笔记与总结(java实现)--二叉树2:非递归二叉树的序列打印练习题...

【数据结构笔记】7:非递归快速排序

快速排序,分而治之。在同为O(N*logN)的几种排序方法中效率较高。

数据结构-非递归遍历二叉树

  • 2017年11月16日 10:28
  • 216KB
  • 下载

汉诺塔c#非递归运算

  • 2014年12月01日 22:40
  • 33KB
  • 下载

经典算法学习——非递归遍历二叉树

我们知道二叉树是一种递归定义的数据结构,包括二叉树的创建、遍历、求树高、叶子节点个数等等。使用递归来进行以上操作非常的简便,相关实现请参考 《C语言实现二叉树的基本操作》。但是今天我们剑走偏锋,使用非...

非递归遍历二叉树

  • 2012年08月04日 09:37
  • 2KB
  • 下载

非递归学习树结构(三)--深广优先搜

深度优先搜索和广度优先搜索是树形结构中常用的两种搜索遍历方式,其实更多的是用在图中的,深度优先搜索可以用来判断有向图中是否存在环,广度优先搜索就更有用了,常用的路径搜索算法一般都是建立在广度优先搜索的...
  • N_sev7
  • N_sev7
  • 2015年09月18日 18:18
  • 492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归转非递归(学习笔记)
举报原因:
原因补充:

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