C语言中斐波拉契数列算法

#include<stdio.h>longintf(longintx){if(x==1)return1;if(x==2)return1;elsereturnf(x-1)+... #include<stdio.h>
long int f(long int x)
{
if(x==1)
return 1;
if(x==2)
return 1;
else
return f(x-1)+f(x-2);
}

int main()
{
int a,i;
scanf("%d",&a);
for(i=1;i<a;i++)
{
printf("%d,",f(i));
}
if(i=a)
printf("%d\n",f(i));
system("pause");
return 0;
}
按照我编的这个程序,运行的时候得到前十个数很容易,可是越往后面越慢,得出第20个数到第二十一个数已经需要很长时间(我的电脑还不错的说),我认为是因为···举个例子:计算F(100),它会计算F(99)+F(98),然而F(99)它又会计算F(98)+F(97),这样总共就要计算2^100次,所以时间很长很长。
现在我不想使用其他的函数,有什么方法可以改进的呢?是不是有某种方法能够使我得到的F(1),F(2),F(3)分一块内存存下来,要用到的时候可以直接读取而不是再三的计算得到呢?
static long int f(long int x) 这种定义不可以实现⊙﹏⊙b。真心求助各位大牛,怎么提高运算速度。
展开
 我来答
我是DOTA玩家
2011-10-30 · 超过12用户采纳过TA的回答
知道答主
回答量:33
采纳率:0%
帮助的人:18.9万
展开全部
你每次计算f(i)都是从头开始的(每次都从f(1)开始一步一步的算),你在循环里调用f函数也就是说对每个i函数f都从i递归到1,做了很多重复功,这就很耗费时间,大大的浪费时间空间资源。其实完全可以不用函数的,i从1开始没计算一个值就保存并输出那个,这样就只需要一次循环,很简单的。还有long int型的有效位数是10位,就算是unsigned long int型的也是只能表示从0到4294967295,更本不可能到f(100),f(100)远超出long int 可表示的范围,long int只能到第46个(1836311903)。
下面是我写的程序,你可以看看(我保留你的f函数,不过没什么用):
#include<stdio.h>
int f(int x)
{
if(x==1)
return 1;
if(x==2)
return 1;
}

int main()
{
int a,i;
unsigned long num[101];
scanf("%d",&a);
for(i=1;i<=a;i++)
{
if(i==1||i==2)
{
num[i]=f(i);
printf("%d\n,",num[i]);
}
else
{
num[i]=num[i-1]+num[i-2];
printf("%ld\n",num[i]);
}
}

return 0;
}
fubigboy
2011-10-30 · TA获得超过543个赞
知道小有建树答主
回答量:194
采纳率:0%
帮助的人:138万
展开全部
递归 运算到后面计算量太大了
这个用递推的好!
#include <stdio.h>
void fa(int n){
int i,x=1,y=1;
for(i=1;i<=n;i++){
if(i<3)
printf("1\t");
else{
y=x+y;printf("%d\t",y);
x=y-x;
}
}
}
void main()
{
int n;
printf("input a number:\n");
scanf("%d",&n);
fa(n);
printf("\n");
system("pause");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lnaizhi
2011-10-30 · TA获得超过1589个赞
知道小有建树答主
回答量:571
采纳率:0%
帮助的人:638万
展开全部
若只是想打印结果,可以这样写:
#include<stdio.h>
long int f(long int x)
{
if(x==1)
{printf("%d",1);
return 1;}
if(x==2)
{ printf("%d",1);
return 1;}
else
{int m=f(x-1)+f(x-2);
printf("%d",m);
return m;}
}

int main()
{
int a,i;
scanf("%d",&a);
f(a);
system("pause");
return 0;
}
追问
好多语法报错了额·····我不知道怎么改了····
是不是有某种方法能够使我得到的F(1),F(2),F(3)分一块内存存下来,要用到的时候可以直接读取而不是再三的计算得到呢?
非常想知道这个问题有没有解决方法
追答
把int  声明改 为long int 看看。
可以记录f(N)的数值。需要修改一下函数

f(int n,int *a)//a为长度>=N的动态数组,传入f当参数时,须初始化每一行为0,完成程序后,a中就保存了对应的数值。
{
if(a[n]!=0)
{ return a[n] ;}
else if(n==1||n==2)
{ a[n]=1;
return 1;}
else
{a[n]= f(n-1,a)+f(n-2,a);
return a[n] ;}
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dwjchdu
推荐于2017-10-01 · TA获得超过5915个赞
知道大有可为答主
回答量:4576
采纳率:60%
帮助的人:1334万
展开全部
main()

  {

  long fib[40] = {1,1};

  int i;

  for(i=2;i<40;i++)

  {

  fib[i ] = fib[i-1]+fib[i-2];

  }

  for(i=0;i<40;i++)

  {

  printf("F%d==%d\n", i, fib[ i]);

  }

  return 0;

  }
追问
输出的结果完全不对啊······⊙﹏⊙b汗
追答
//利用循环输出前40项 
  #include
  int main()
  {
  long fib[41] = {0,1};
  int i;
  for(i=2;i1) return fib(n-1)+fib(n-2);
  }
  int main()
  {
  int k=1;
  while(k!=0)
  {
  puts("input a num n 0 for exit");
  scanf("%d",&k);
  printf("%ld\n",fib(k));
  }
  getch();
  return 0;
  }
  //高精度斐波那契数列(3000长度的可求到第10000多项)
  #include
  #include
  using namespace std;
  int a[3001]={};
  int b[3001]={};
  int c[3001]={};
  int n;
  int main()
  {
  scanf("%d",&n);
  if(n=10)
  {c[j]=c[j]-10;
  c[j+1]=1;}
  }
  }
  int i=3000;
  while(c[i]==0) i--;
  for(i=i;i>=1;i--)
  printf("%d",c[i]);
  printf("\n");
  system("pause");
  return 0;
  }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
素雅且闲雅丶繁花7359
2011-10-30 · TA获得超过6.3万个赞
知道大有可为答主
回答量:2.5万
采纳率:0%
帮助的人:3750万
展开全部
haha
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式