| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 721 人关注过本帖
标题:【求助】斐波那契数列优化算法
只看楼主 加入收藏
斋宅窄寨
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2014-1-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
【求助】斐波那契数列优化算法
要求输入0<=N<=50,输出斐波那契数列第N项的值。
#include<stdio.h>
int fn(int x)
{
if(x<=1){
return x;
}
else if(x==2){
return 1;
}
else {
return fn(x-1)+fn(x-2);
}
}
int main()
{
int a;
scanf("%d\n",&a);
a=fn(a);
printf("%d\n",a);
return 0;
}
这是我写的源码,在编译器上试过结果没问题,但运行时间太长,所以这个练习就过不了关(一学习编程的网站)。我考虑可能是每次都要判断是否小于等于1,从而导致时间延长,但又不知道怎么改进会更好些,不知坛里的大神们可否指点迷津。
2014-01-20 14:41
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
讲递归的知识的时候, 几乎所有的书都会以斐波那契数列为例子. 可是斐波那契数列却并不适合用递归来实现.
直接用循环.
 
2014-01-20 14:45
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
你的代码把
if(x<=1){
return x;
}
else if(x==2){
return 1;
}
改成 if(x == 1 || x == 2)
            return 1;
2014-01-20 14:58
斋宅窄寨
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2014-1-20
收藏
得分:0 
回复 2楼 pangshch
哦?不合适在哪呢?
2014-01-20 15:04
斋宅窄寨
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2014-1-20
收藏
得分:0 
回复 3楼 pangshch
可是要求里还有输入"0",要怎么办?
2014-01-20 15:06
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用斋宅窄寨在2014-1-20 15:04:06的发言:

哦?不合适在哪呢?
运行f(n-1)的时候, 会计算f(n-2).f(n-3), f(n-4)....
运行f(n-2)的时候, 会计算f(n-3). f(n-4).....
......
如果n是50, f(1),f(2)要重复48次 , f(3)要重复47次, .....
次数少的时候不觉得. 多了就没内存了.
2014-01-20 15:14
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用斋宅窄寨在2014-1-20 15:06:26的发言:

可是要求里还有输入"0",要怎么办?
那就再加一个
if(x == 0)
return 0;
2014-01-20 15:15
斋宅窄寨
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2014-1-20
收藏
得分:0 
回复 6楼 pangshch
是哦,那用循环怎么做呢?
2014-01-20 15:19
斋宅窄寨
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2014-1-20
收藏
得分:0 
回复 7楼 pangshch
那和我的同样用了两个if,在时间上应该没有区别吧?
2014-01-20 15:21
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用斋宅窄寨在2014-1-20 15:19:53的发言:

是哦,那用循环怎么做呢?

#include <stdio.h>
int main()
{

    double a[50];  // 从0开始,第50个数有100亿以上了.如果你的编译器支持, 也可以定义为long long型.
    int i;

    a[0] = 0;
    a[1] = 1;

    for (i = 2; i < 50; i++)
        a[i] = a[i-1] + a[i-2];
    printf("%.0f\n", a[49]);
    return 0;
}

2014-01-20 15:33
快速回复:【求助】斐波那契数列优化算法
数据加载中...
 
   



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

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