递归转非递归理解
来源:互联网 发布:js array indexof ie8 编辑:程序博客网 时间:2024/05/04 11:04
可以使用下面这几种方法来实现递归到非递归的转换.
(1) 循环方法
循环方法是所有递归到非递归的转换中最理想的方法,可以将开销减少到最小.
不过也是分析起来最复杂的,对于简单的递归可以用这样的方法来处理.
例如:Factorial计算
这里回到n!(阶乘)定义上面来分析,这里将n!数学意思为n! = n*(n-1)! & 1!=1;做一个扩展可以到到n!另外一个表示方法n! = n*(n-1)*(n-2)*....*1;
这样就可以很容易得到另外一个定义:
n!表示执行n次循环计算一个增量k,初始k=1和结果t=1;每次t乘以k++的值.
ISO C++实现代码如下:
Factorial(int n){ int k = 1 ;//增量 int t = 1 ;//临时结果 while(k!=n){ t*=k; k++; } return t;}
这样可以避免递归带来的大量堆栈操作.
(2) 自定义堆栈
对于复杂逻辑的堆栈操作,需要借助外部堆栈来实现.
因为对于所有的递归操作最后分析出来都是形成的一颗树形结构.
下面是一个递归实现Factorial的一个方法,虽然在这个程序中对比循环来相对复杂,不过对于一些不能分析出来循环的递归操作来说自定义堆栈的方法可以达到空间开销可控.
Factorial(int n){ Stack s; int t = 1;//临时变量 s.push(n); while(s.top()!=1)[ t *= s.top(); s.push(s.top()-1); s.pop(); } return t;}
除了上面这两种方法外,还可以使用一种迭代的方法实现递归到非递归的处理.
- 递归转非递归理解
- 递归转非递归
- 对递归和非递归的理解
- 递归算法转非递归
- 递归转非递归(学习笔记)
- 快速排序 递归转非递归
- 递归转非递归几个实例
- 递归转非递归的栈方法
- 递归与非递归
- 斐波拉契(递归非递归)
- 汉诺塔,递归&非递归
- 非递归和递归
- 递归 非递归
- 递归VS非递归
- 递归与非递归
- 递归与非递归
- 递归与非递归
- 递归与非递归
- [LeetCode] Populating Next RIght Pointer in Each Node II
- ImageUtils工具演示
- C语言运算符优先级
- 灯光上网"技术江苏已实现 仍难取代无线宽带
- 递归,回溯,DFS,BFS的理解和模板
- 递归转非递归理解
- Tor 介绍
- How to use JPA from a JBoss Web application ?(jboss 中如何使用线程安全的EntityManagerFactory )
- MillionDollarHomePage.com:100万美元的网页
- JSP中form标签的使用
- HTML5中input属性在JSP中的使用
- svn常用指令
- 所以他很清楚
- GPS定位之非差,单差,双差