CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请问:不用递归 怎么实现F(X)=F(X-1)+F(X-2)呢?

楼主lianxiangpanjin(联想)2005-03-04 09:38:28 在 C/C++ / C语言 提问

请问不用递归怎么实现F(X)=F(X-1)+F(X-2)呢? 问题点数:10、回复次数:25Top

1 楼missdeer(思鹿)回复于 2005-03-04 09:43:10 得分 0

菲波那切数列?  
  int   x1=1,x2=1;  
  for(int   i=0;   i<   N;   i++)  
  {  
        x1=x1+x2;//奇数项,第3,5,7,9...项  
        x2=x1+x2;//偶数项,第4,6,8,10...项  
  }Top

2 楼yiminggw(某某鸟人)回复于 2005-03-04 09:44:25 得分 0

递归和循环可以互转  
  Top

3 楼yc0188(守护瓶(萍))回复于 2005-03-04 09:57:16 得分 0

请问不用递归怎么实现F(X)=F(X-1)+F(X-2)呢?  
   
  int   Fibonacci(int   n)  
  {  
          int   p,   l,   t,   l;  
          if(n   ==   1)  
                  return   0;  
          elseif(   n   ==   2)  
                  return   1;  
          else  
          {  
                    l   =   0;  
                    t   =   0;  
                    for(i   =   3;   i   <=   n;   i++)  
                    {  
                              p   =   l;  
                              l   =   t;  
                              t   =   p   +   l;  
                      }  
                      return   t;  
            }  
  }  
  Top

4 楼yc0188(守护瓶(萍))回复于 2005-03-04 09:58:21 得分 0

这个是程序设计方法学里的算法!  
  多去看看书吧!Top

5 楼lianxiangpanjin(联想)回复于 2005-03-04 09:59:10 得分 0

to   missdeer(思鹿)   :  
  for()     中间的那段什么意思能解释下吗?  
   
  我们老师说可以通过设变量   实现不用递归求出,那种方法有人会吗?Top

6 楼jialuo(jialuo)回复于 2005-03-04 10:02:07 得分 10

int   f(int   n)  
  {  
    if(n>2)  
        {  
        int   f1=1,f2=1,f3;  
        for(int   i=3;i<=n;i++)  
          {  
              f3=f2+f1;  
              f1=f2;  
              f2=f3;  
          }  
        return   f3;  
        }  
    else  
        return   1;  
  }Top

7 楼lianxiangpanjin(联想)回复于 2005-03-04 10:11:58 得分 0

to     yc0188(我好堕落)   好办法,  
   
   
  请问大家还有别的方法吗?Top

8 楼changyanshuo(尘埃)回复于 2005-03-04 10:14:41 得分 0

 
  很多人都已经正解  
   
  如果不用递归,就用递推了  
   
  Top

9 楼missdeer(思鹿)回复于 2005-03-04 10:17:19 得分 0

to   missdeer(思鹿)   :  
  for()     中间的那段什么意思能解释下吗?  
   
  我们老师说可以通过设变量   实现不用递归求出,那种方法有人会吗?  
  ====================================  
  循环里:  
  x1=x1+x2;   这样x1就是第3项了(第1项+第2项)  
  然后x2=x1+x2;这样x2就是第4项了(第3项+第2项)  
  …………Top

10 楼pcboyxhy(-273.15℃)回复于 2005-03-04 12:05:14 得分 0

1.这个数列存在非递归的通项公式,  
  貌似   (1+sqrt(5))^n/2+(-1+sqrt(5))^n/2,也许记错了。  
   
  2.迭代。  
  #include<iostream.h>  
  #include<string.h>  
  const   int   maxlenx=7000;  
  int   main(   int   argc,   char   *   argv[]   )  
  {  
      char   num[2][maxlenx];  
      int   g,i,n,m,a=0,b,j;  
      memset(num,   0,   2*maxlenx);  
      cin>>n;   cout<<endl;  
      m=2;num[0][0]=1;num[1][0]=1;  
      for(i=2;   i<n;   i++)  
      {  
          a=i%2;   b=(a+1)%2;   g=0;  
          for(j=0;   j<m;   j++)  
          {  
              num[a][j]=num[a][j]+num[b][j]+g;  
              g=num[a][j]/10;  
              num[a][j]%=10;  
          }  
          if(num[a][j-1])   m++;  
        }  
        for(i=m-2;   i>=0;   i--)  
        cout<<int(num[a][i]);  
      return   0;  
  }  
   
  这段代码可以计算位数<7000的值.Top

11 楼sky911911(assda)回复于 2005-03-04 13:35:37 得分 0

int   Fibonacci(int   n)  
  {  
          int   p,   l,   t,   l;  
          if(n   ==   1)  
                  return   0;  
          elseif(   n   ==   2)  
                  return   1;  
          else  
          {  
                    l   =   0;  
                    t   =   0;  
                    for(i   =   3;   i   <=   n;   i++)  
                    {  
                              p   =   l;  
                              l   =   t;  
                              t   =   p   +   l;  
                      }  
                      return   t;  
            }  
  }  
  谁帮解释一下   不是很明白   怎么两个l   ???Top

12 楼gtownsin(唐僧)回复于 2005-03-04 13:37:34 得分 0

yc0188(我好堕落)   的程序逻辑是有点不对如果顺序改成(t   =   p   +   l;p   =   l;l   =   t;)就对了,jialuo(jialuo)   的逻辑基本正确  
  Top

13 楼gtownsin(唐僧)回复于 2005-03-04 13:41:34 得分 0

-〉sky911911(assda)   谁帮解释一下   不是很明白   怎么两个l   ???  
  可能是笔误  
  Top

14 楼bouluo505(bouluo)回复于 2005-03-04 14:46:42 得分 0

这是个一般的解法,以前做的,没改进过,发上来大家讨论讨论!  
  #include   <stdio.h>  
  #define   N   100  
  int   f[N];  
   
  int   fibonaci(int   k,int   m)  
  {  
  for(int   i=0;i<k-1;++i)  
  f[i]=0;  
  f[k-1]=1;  
  if(m>=1&&m<=k-1)   return   0;  
  if(m==k)   return   1;  
  else{  
  for(int   j=k;j<=N;j++)  
  {  
      f[j]=0;  
    for(int   t=j-1;t>=j-k;t--)  
      f[j]+=f[t];  
      if(j==m-1)  
      return   f[j];  
  }  
      return   -1;  
  }  
  }  
   
  void   main(){  
  int   k,m;  
  printf("INPUT:");  
  scanf("%d   %d",&k,&m);  
  f[m]=fibonaci(k,m);  
  if(f[m]<0)  
  printf("Cann't   solve   it!\n");  
  else  
  printf("\n%d\n",f[m]);  
  }  
  Top

15 楼bouluo505(bouluo)回复于 2005-03-04 14:51:13 得分 0

可以稍改一下数组就可以计算更大的数,还有就是改一   下头文件和有关函数以更能说明是用C++编的!上面的程序是在VC6.0用编译的!!Top

16 楼w626872(科本)回复于 2005-03-04 15:16:13 得分 0

给诸位热爱C语言的朋友奉贤上一个群   C/C++专用群   10068879   注名csdn    
  希望大家在一起努力,一起学习~互助  
  Top

17 楼leoliuhpo(流风的人)回复于 2005-03-05 03:40:58 得分 0

其实程序员的书上有这个题,用Stack实现的.Top

18 楼pcboyxhy(-273.15℃)回复于 2005-03-05 09:15:58 得分 0

用Stack实现?  
  这么烂Top

19 楼baryjim(吃饭-睡觉-打豆豆)回复于 2005-03-05 09:35:33 得分 0

用stack效率太低了!!  
   
  用有限个单元就可以进行处理!Top

20 楼iwlla(iwlla)回复于 2005-03-05 17:05:14 得分 0

用一个数组应该可以的吧?  
  for   (i=2;i<N;i++)   /*N自己定义大小*/  
  F(i)=F(i-1)+F(i-2);  
  不过这样浪费内存空间,但可以得到每一项的值.  
  int   f(int   n)  
  {  
    if(n>2)  
        {  
        int   f1=1,f2=1,f3;  
        for(int   i=3;i<=n;i++)  
          {  
              f3=f2+f1;  
              f1=f2;  
              f2=f3;  
          }  
        return   f3;  
        }  
    else  
        return   1;  
  }  
  这个得到的是最后一个值.但节约内存空间,具体用哪个要根据具体情况来定Top

21 楼iwlla(iwlla)回复于 2005-03-05 17:06:51 得分 0

用一个数组应该可以的吧?  
  for   (i=2;i<N;i++)   /*N自己定义大小*/  
  F[i]=F[i-1]+F[i-2];  
  不过这样浪费内存空间,但可以得到每一项的值.  
  int   f(int   n)  
  {  
    if(n>2)  
        {  
        int   f1=1,f2=1,f3;  
        for(int   i=3;i<=n;i++)  
          {  
              f3=f2+f1;  
              f1=f2;  
              f2=f3;  
          }  
        return   f3;  
        }  
    else  
        return   1;  
  }  
  这个得到的是最后一个值.但节约内存空间,具体用哪个要根据具体情况来定  
  Top

22 楼greenery(greenery)回复于 2005-03-05 22:51:06 得分 0

没写过,过去试试看先。Top

23 楼tsocpp(小黑子)回复于 2005-03-06 00:51:33 得分 0

这道题很简单啊,不用递归就用迭代的方法啊,很多的写对了啊  
   
  拿       yc0188(我好堕落)       的程序作个注释吧,希望你不会介意,    
     
         
  int   Fibonacci(int   n)  
  {  
          int   p,   l,   t,   l;     //多打了一个l吧???  
          if(n   ==   1)                 //这里是数字1不是字母l,虽然它们长的很象  
                  return   0;  
          elseif(   n   ==   2)  
                  return   1;  
          else  
          {  
                    l   =   0;                
                    t   =   0;         //好象应该对t赋初值为数1吧?不然F(3)就=0了,但F(2)已经是1了  
                    for(i   =   3;   i   <=   n;   i++)  
                    {  
                              p   =   l;//   gtownsin(唐僧)   认为他循环体内的逻辑有问题,应该  
                              l   =   t;//改成(t   =   p   +   l;p   =   l;l   =   t;),我觉得两个都是可以的,而且是一样的  
                              t   =   p   +   l;//而且他的似乎更好,因为在跳出循环前再对其进行                    
                      }                         //p=l;l=t;   置换,显得点多余  
   
                      return   t;  
            }  
  }  
   
      以上纯是个人意见,有不同看法的可以提出来讨论!  
     
  Top

24 楼junmayang(笨猪)回复于 2005-03-06 15:05:35 得分 0

用栈!不过有点杀鸡用牛刀了Top

25 楼gtownsin(唐僧)回复于 2005-03-07 08:54:12 得分 0

--->>>tsocpp(小黑子)    
  你说得不错,我当时没有仔细考虑!Top

相关问题

  • 快速排序的非递归实现
  • 求助:递归的设计与实现
  • 用递归实现树 算法
  • 如何实现这个递归算法?
  • sqlserver中怎么实现递归查询?
  • 请教关于求递归函数F的递归算法和非递归算法的问题!
  • 递归……
  • 递归?
  • 递归.........
  • 递归

关键词

  • maxlenx

得分解答快速导航

  • 帖主:lianxiangpanjin
  • jialuo

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo