斐波那契数列的递归和迭代实现之差异
2008-12-21 14:25
351 查看
如题。
代码如下,vc6.0下编译通过。
#include<iostream>
#include<map>
using namespace std;
int stack = 0; // 记录堆栈的使用情况,每进入一次函数,就加1
map<int,int> m;
//单纯递归
int fibo(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
return fibo(n-2) + fibo(n-1);
return 0;
}
//利用迭代
int fibo2(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
{
int first=1,second=1,i=2,result=0;
while(i<n)
{
result = first + second;
first = second;
second = result;
if(++i==n)
return result;
}
}
}
//递归,但保存已经算过的结果,避免重复计算
int fibo3(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
{
if(m
==0)
{
cout<<"m["<<n<<"] does not exist,so create it"<<endl;
return m
= fibo3(n-2) + fibo3(n-1);
}
else
{
cout<<"m["<<n<<"] exists!"<<endl;
return m
;
}
}
return 0;
}
int main()
{
cout<<"enter n:"<<endl;
int n;
cin>>n;
//cout<<"fibo("<<n<<") is "<<fibo(n)<<endl;
//cout<<"fibo("<<n<<") is "<<fibo2(n)<<endl;
cout<<"fibo("<<n<<") is "<<fibo3(n)<<endl;
cout<<"map used: "<<m.size()<<endl;
for(map<int,int>::iterator i=m.begin();i!=m.end();++i)
cout<<i->first<<": "<<i->second<<endl;
cout<<"stack size used: "<<stack<<endl;
}
算到40时,fibo1的表现差劲,近10秒才算出来,其他两个瞬间算出。
代码如下,vc6.0下编译通过。
#include<iostream>
#include<map>
using namespace std;
int stack = 0; // 记录堆栈的使用情况,每进入一次函数,就加1
map<int,int> m;
//单纯递归
int fibo(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
return fibo(n-2) + fibo(n-1);
return 0;
}
//利用迭代
int fibo2(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
{
int first=1,second=1,i=2,result=0;
while(i<n)
{
result = first + second;
first = second;
second = result;
if(++i==n)
return result;
}
}
}
//递归,但保存已经算过的结果,避免重复计算
int fibo3(int n)
{
++stack;
if(n==1)
return 1;
if(n==2)
return 1;
if(n>2)
{
if(m
==0)
{
cout<<"m["<<n<<"] does not exist,so create it"<<endl;
return m
= fibo3(n-2) + fibo3(n-1);
}
else
{
cout<<"m["<<n<<"] exists!"<<endl;
return m
;
}
}
return 0;
}
int main()
{
cout<<"enter n:"<<endl;
int n;
cin>>n;
//cout<<"fibo("<<n<<") is "<<fibo(n)<<endl;
//cout<<"fibo("<<n<<") is "<<fibo2(n)<<endl;
cout<<"fibo("<<n<<") is "<<fibo3(n)<<endl;
cout<<"map used: "<<m.size()<<endl;
for(map<int,int>::iterator i=m.begin();i!=m.end();++i)
cout<<i->first<<": "<<i->second<<endl;
cout<<"stack size used: "<<stack<<endl;
}
算到40时,fibo1的表现差劲,近10秒才算出来,其他两个瞬间算出。
相关文章推荐
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 用递归,迭代,通项公式三种方法实现斐波那契数列求解
- 斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
- 斐波那契数列的递归、迭代(循环)、通项公式三种实现
- C语言实现斐波那契数列的两种方法(递归和迭代)
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 通过斐波那契数列分析递归与迭代时间差异
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 斐波那契数列迭代和递归实现
- 剑指offer----斐波那契数列的实现--递归和迭代
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- php递归与迭代实现斐波那契数列
- Python3基础 用 函数递归实现 斐波那契数列
- PHP迭代与递归实现无限级分类
- 折半查找的c++模板递归和迭代实现
- 用递归和迭代分别处理斐波那契数列
- 格雷码的几种实现方式 递归 迭代 递推
- C语言斐波那契数列的四种实现方式—递归,迭代,数组,队列