| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3655 人关注过本帖
标题:求助,调试太慢了,等了一分钟都没出结果
只看楼主 加入收藏
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求助,调试太慢了,等了一分钟都没出结果
#include<stdio.h>

long long int Fibonacci(int n)
{
    long long int y;
    if(n<=2)
        y=1;
    else
        y=Fibonacci(n-1)+Fibonacci(n-2);
    return(y);
}

int main()
{
    long long int n,F;
    scanf("%d",&n);
    F=Fibonacci(n);
    printf("%d",F);
    return 0;
}
这段代码输入时结果没错,但输出太慢,输入40时得等5秒钟,输入60等了一分钟都没出结果
2016-11-24 19:58
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:14 
求斐波那契数列第n项用递归函数写除了可读性更好点,与for循环相比一点优势都没有。
时间上, 执行调用与返回的额外工作要占用CPU时间。空间上,随着每递归一次,栈内存就多占用一截。
你可以统计下输入40时递归函数的调用次数,与时间的关系,然后逐渐增加n的数值,看看统计的次数变化有多大。
2016-11-24 21:01
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 2楼 linlulu001
要求必须用递归
2016-11-24 21:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
一个递归函数里面包含了两个子递归点,正常情况下总递归次数以指数的的形式增长,指数幂为该数的增长率,斐波那契数列的和以每一项无穷接近根号2的倍率增长,递归次数同样也以无限接近根号2的倍率增长,输入40要等待5秒,输入60要等待5^10秒,就是9765625秒,折合起来约为113天时间~笑了~
你有时间可以去比划一下斐波那契数列的递归过程~

[此贴子已经被作者于2016-11-25 03:29编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-25 03:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
怎么这么多人刷屏啊~上贴分明就是说错了,输入60明明是5*2^10秒,5120秒,一个多小时就可以了~纯属口误~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-25 04:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
long long int n,F;
scanf("%d",&n);
这个起先就错了吧

要求必须用递归 ------ 那就别抱怨速度慢呀
2016-11-25 08:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
给个我以前写的(顺便说一下,如果最大40项的话,根本用不到long long)

程序代码:
#include <stdio.h>

unsigned long long fibonacci( unsigned first, unsigned second, size_t n )
{
    // a *= b
    #define MUL(a,b) do {\
        unsigned long long t00 = a##00*b##00+a##01*b##10;\
        unsigned long long t01 = a##00*b##01+a##01*b##11;\
        unsigned long long t10 = a##10*b##00+a##11*b##10;\
        unsigned long long t11 = a##10*b##01+a##11*b##11;\
        a##00=t00, a##01=t01, a##10=t10, a##11=t11;\
    } while(0)

    unsigned long long r00=1,r01=0,r10=0,r11=1;
    for( unsigned long long v00=0,v01=1,v10=1,v11=1; n!=0; n/=2 )
    {
        if( n%2 == 1 )
            MUL(r,v); // r*=v
        MUL(v,v); // v*=v;
    }
    return r00*first + r01*second;

    #undef MUL
}

int main( void )
{
    printf( "%llu\n", fibonacci(1,1,39) ); // fibonacci数列第40项的值是 102334155

    return 0;
}

2016-11-25 08:51
快速回复:求助,调试太慢了,等了一分钟都没出结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017091 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved