查看: 1846| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

关于recursive求fibonacci求助

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
recursive算fibonacci很慢。 于是,我想找个办法改进他。 发现recursive算法有很多重复的运算。 我变用hash来去重。 可是,不知道为什么。 47之前都是正确的,从47往后出现了负数。 这是什么原因呢? 求大神帮忙看下~
  1. int  fib(int n, myhash &h){
  2.    
  3.         if(n==0) {
  4.                 h[0] = 0;
  5.                 return h[n];
  6.         }
  7.         if(n==1) {
  8.                 h[1] = 1;
  9.                 return h[n];
  10.         }
  11.         if(n==2){
  12.                 h[2] = 1;
  13.                 return h[n];
  14.         }
  15.    
  16.         myhash::iterator iter1 = h.find(n-1);
  17.         myhash::iterator iter2 = h.find(n-2);
  18.         if(iter1 != h.end()&&iter2 !=h.end()){
  19.                  h[n] = h[n-1]+h[n-2];
  20.              return h[n];
  21.         }else if(iter1 == h.end()&&iter2 !=h.end()){
  22.                 h[n] = fib(n-1,h) + h[n-2];
  23.                 return h[n];
  24.         }else if(iter1 != h.end()&&iter2 ==h.end()){
  25.                 h[n] = h[n-1] + fib(n-2,h);
  26.             return h[n];
  27.         }else if(iter1 == h.end()&&iter2 ==h.end()){
  28.                 h[n] = fib(n-1,h)+fib(n-2,h);
  29.                 return h[n];
  30.         }
  31. }

  32. int myfib(int n){
  33.     myhash h;
  34.     return fib(n, h);
  35. }
复制代码

上一篇:【七类排序】之第四种:快速排序
下一篇:【七类排序】之第五种:希尔排序
🔗
lunaughty 2012-12-7 17:20:53 | 只看该作者
全局:
本帖最后由 lunaughty 于 2012-12-7 17:24 编辑

LZ贴出来的代码都没问题,能不能把你的myhash类拿出来看看?个人强烈怀疑是因为处理散列冲突的方式有问题。
另外这个东西不适合用递归啊。最简单的for (i=2,i<=n;i++) h=h[i-1]+h[i-2];就可以了吧
另外这个数列是可以直接用公式算的,有兴趣的话可以百度~
回复

使用道具 举报

🔗
海拔2纳米 2012-12-7 21:47:07 | 只看该作者
全局:
lunaughty 发表于 2012-12-7 17:20
LZ贴出来的代码都没问题,能不能把你的myhash类拿出来看看?个人强烈怀疑是因为处理散列冲突的方式有问题。 ...

斐波那契的公式长得太难看了
回复

使用道具 举报

全局:
看看是不是超出整形范围溢出了?
回复

使用道具 举报

🔗
msallk 2012-12-8 03:19:35 | 只看该作者
全局:
你看看fib(47)有多大就知道了。。就算换成double,也多算不了几个。。

点评

超过最大32^2的int  发表于 2012-12-8 03:29
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-12-8 06:48:39 | 只看该作者
全局:
msallk 发表于 2012-12-8 03:19
你看看fib(47)有多大就知道了。。就算换成double,也多算不了几个。。

确实是超出范围了。  谢谢
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-12-8 06:48:53 | 只看该作者
全局:
geniusroger2000 发表于 2012-12-8 03:12
看看是不是超出整形范围溢出了?

谢谢,是超出范围了
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-12-8 06:50:33 | 只看该作者
全局:
lunaughty 发表于 2012-12-7 17:20
LZ贴出来的代码都没问题,能不能把你的myhash类拿出来看看?个人强烈怀疑是因为处理散列冲突的方式有问题。 ...

用的是c++自己的hash
回复

使用道具 举报

🔗
brilight 2012-12-29 05:54:56 | 只看该作者
全局:
本帖最后由 brilight 于 2012-12-29 05:57 编辑

為什麼不用Iterative呢?

int fib(int n)
{
    int a=1;
    int b=1;
    int c;
    if(n<=2) return 1;
   
    for(i=3;i<=n;i++){
        c=a+b;
        a=b;
        b=c;
    }
    return c;

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表