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

原创 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)的几种排序方法中效率较高。

汉诺塔c#非递归运算

  • 2014-12-01 22:40
  • 33KB
  • 下载

单链表的反转(非递归)

问题:输入一个链表的头节点,反转该链表,并返回反转后链表的头节点。分析: (1)首先,注意一个概念,头节点,头节点中并没有真正的链表数据,而且头节点的存在仅仅是为了方便计算,所以反转链表是指”反转除...

非递归遍历二叉树

【BZOJ1179】【Apio2009】Atm 强连通分量缩点+拓扑DP/拓扑最长路 kosaraju+tarjan+dfs转非递归三种代码

kosaraju、tarjan、kosaraju dfs转非递归,三种代码。。。 可以有效对付卡系统栈的管理员。。。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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