消除递归的方法
2015-08-21 19:33
260 查看
1、若递归是尾递归,那利用循环就可以消除,尾递归是是在函数末尾递归调用本函数的方式,满足以下格式:
尾递归采用循环,利用n=1的结果,定义一个变量记res记住,然后循环慢慢算n=2、3....的结果,每次计算出n的值后都让res记住,每次计算function的值利用res计算,下面给出计算一个例子
2、若不是非递归就需要基于栈来消除递归,详细过程可见:耿国华 ,数据结构129页。
int function(int n){ if(n==0) return 1; else return function(n-1); }
尾递归采用循环,利用n=1的结果,定义一个变量记res记住,然后循环慢慢算n=2、3....的结果,每次计算出n的值后都让res记住,每次计算function的值利用res计算,下面给出计算一个例子
#include <stdio.h> //递归的方法 int fib(int n) { if(n==1) return 1; if(n==0) return 0; else return fib(n-1)+fib(n-2); } 非递归的方法 int fib2(int n) { if(n==1) return 1; else if(n==0) return 0; int fib0=0; int fib1=1; int result=0; for(int x=2;x<=10;x++) { result=fib0+fib1; fib0=fib1; fib1=result; } return result; } void main() { int a=fib(10); int b=fib2(10); printf("a的值是:%d\n",a); printf("b的值是:%d\n",b); }
2、若不是非递归就需要基于栈来消除递归,详细过程可见:耿国华 ,数据结构129页。
相关文章推荐
- DataSetObservable,Observable<T>,DataSetObserver源码注释翻译
- 将一个或多个OC对象写入文件/从文件读出
- ZOJ 3529 A Game Between Alice and Bob
- java中常用io流 BufferedInputStream和BufferedOutputStream
- js流程控制语句(判断语句)
- 【 D3.js 入门系列 --- 9.3 】 弦图生产
- JAVA12个最重要的J2EE最佳实践
- img下图形必须刷新才显示最新数据的问题
- 2015 HUAS Summer Contest#5~B
- 微信内置浏览器的 User Agent的判断
- spmio 内网源部署(二)
- sql server 2008如何导入mdf,ldf文件
- CSND博文书写格式
- 多线程
- 关于UIScreen的applicationFrame和bounds方法区别
- KM算法板子2
- 简单封装的httpclient
- MySQL 调优/优化的 100 个建议
- ios开发学习--歌词处理--解析lrc文件
- 前向声明 前置声明 Forward Declare