Lucas 数列:1, 3, 4, 7, 11, 18, 29, 47, 76, 123...
法一
#include<iostream>
#include<cmath>
using namespace std;
long long int Lucas(int n)//定义函数
{
long long int result,a=1,b=3,c;
if (n==1)
return a;//定义第一 项
else if (n==2)
return b;//定义第二项
else
{
for (int i=3;i<=n;i++)
{
c=a+b;
result=c;//求第三项
a=b;//将第二项的值赋予a
b=c;//将第三项的值赋予b
}
}
return result;//返回结果
}
int main()
{
int m;
cout<<"输入一个整数:";
cin>>m;
cout<<"该处的Lucas值是:"<<Lucas(m);
return 0;
}
法二
#include<iostream>
#include<cmath>
using namespace std;
long long int Lucas(int n)
{
int result,a=1,b=3;
if (n==1)
return a;
else if (n==2)
return b;
else
return Lucas(n-2)+Lucas(n-1);
}
int main()
{
int m;
cout<<"输入一个整数:";
cin>>m;
cout<<"该处的Lucas值是:"<<Lucas(m)<<endl;
return 0;
}
递归 Lucas 函数的调用次数
改进前面的递归 Lucas 函数,使之能够记录被调用次数
利用改进的函数,计算 Lucas 数列的第 30 项,并统计此时函数被调用了多少次
如果计算 Lucas 数列的第 50 项呢?存在什么问题?怎么解决这个问题?
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
using namespace std;
long long int d=0;
long long int Lucas(int n)
{
d++;//定义一个项数
int result,a=1,b=3,c;
if (n==1)
return a;
else if (n==2)
return b;
else
return Lucas(n-2)+Lucas(n-1);
}
int main()
{
int m;
cout<<"输入一个整数:";
cin>>m;
cout<<"该处的Lucas值是:"<<Lucas(m)<<endl;
cout<<"调用次数n="<<d<<endl; //显示项数
return 0;
}
运行50项函数被调用次数过多,运行速度慢,可能会产生溢出。
解决方法:1.用非递归法进行计算。
2.换用数据类型。