【ACM】-斐波那契数列 -- 递归并不一定就是好_fibonacci数java acm-程序员宅基地

技术标签: acm  

斐波那契数列

时间限制(普通/Java) :  1000 MS/ 10000 MS          运行内存限制 : 65536 KByte
总提交 : 5750            测试通过 : 2053 

比赛描述

在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义:

F0 = 0

F1 = 1

Fn = Fn - 1 + Fn - 2

用文字来说,就是斐波那契数列由01开始,之后的斐波那契数就由之前的两数相加。首几个斐波那契数是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………

特别指出:0不是第一项,而是第零项。

在西方,最先研究这个数列的人是比萨的列奥纳多(又名斐波那契),他描述兔子生长的数目时用上了这数列。

n       第一个月有一对刚诞生的兔子

n       第两个月之后它们可以生育

n       每月每对可生育的兔子会诞生下一对新兔子

n       兔子永不死去

假设在n月有新生及可生育的兔子总共a对,n+1月就总共有b对。在n+2月必定总共有a+b对:因为在n+2月的时候,所有在n月就已存在的a对兔子皆已可以生育并诞下a对后代;同时在前一月(n+1)b对兔子中,在当月属于新诞生的兔子尚不能生育。

 

现请以较短的时间,求出斐波那契数列第n项数值,0n40



输入

斐波那契数列项数n0n40

输出

斐波那契数列第n项数值

样例输入

4

样例输出

3

题目来源

NUPT



第一次的答案:
#include<stdio.h>

int fun(int a)
{
        if(a == 0)
                return 0;
        if(a==1 || a==2)
                return 1;
        else
                return fun(a-1) + fun(a-2);
}

int main()
{
  int a = 0;
  scanf("%d", &a);
  if(a> 40)
        return 0;
  int  sum = fun(a);
  printf("%d\n", sum);
  return 0
}

代码 很简洁 但是 却显示 时间 超限。 想想也是 递归的实质 是由上之下的调用,最后在层层 回调, 而fun(a-1) + fun(a-2)很多都是重复的 。


后来 重写一个 谢天谢地过了:
#include<stdio.h>
#define N 41
int main()
{
        int num = 0, sum = 0;
        int a[N]={0};
        a[0] = 0;
        a[1] = 1;
        a[2] = 1;
        int i =0;
        scanf("%d", &num);
        if(num > 40)
        if(num == 0)
        {
                printf("0\n");
                return 0;
        }
        else if(num == 1 || num == 2)
        {
                printf("1\n"); return 0;
        }
        for(i=3; i<=num; i++)
        {
                if(a[i] == 0)
                {
                        a[i] = a[i - 1] + a[i-2];
                }
        }

        printf("%d\n", a[num]);

        return 0;
}

注意 N = 41,

Accepted
11 MS
   208 K
693Byte
GCC
2015-07-16 11:31:56.0

利用gettimeofday函数 获取时间   

#include<stdio.h>
 #include <sys/time.h>
int fun(int a)
{
        if(a == 0)
                return 0;
        if(a==1 || a==2)
                return 1;
        else
                return fun(a-1) + fun(a-2);
}

int main()
{
  struct timeval start, end;
  gettimeofday(&start, NULL);
  int a = 40;
 // scanf("%d", &a);
  if(a> 40)
        return 0;
  int  sum = fun(a);
  gettimeofday(&end, NULL);
  printf("%d\n", sum);
  int timeuse = 1000000*(end.tv_sec -start.tv_sec) + end.tv_usec - start.tv_usec;

   printf("seconds: %d us\n", timeuse);

  return 0 ;
}

: 102334155
seconds: 745969 us


而  不用递归
#include<stdio.h>
#include<sys/time.h>
#define N 41
int main()
{
        struct timeval start, end;
        gettimeofday(&start, NULL);
        int num = 40, sum = 0;
        int a[N]={0};
        a[0] = 0;
        a[1] = 1;
        a[2] = 1;
        int i =0;
  //      scanf("%d", &num);
        if(num > 40)
        if(num == 0)
        {
                printf("0\n");
                return 0;
        }
        else if(num == 1 || num == 2)
        {
                printf("1\n"); return 0;
        }
        for(i=3; i<=num; i++)
        {
                if(a[i] == 0)
                {
                        a[i] = a[i - 1] + a[i-2];
                }
        }

        printf("%d\n", a[num]);
        gettimeofday(&end, NULL);
<span style="white-space:pre">	</span>int timeuse = 1000000*(end.tv_sec -start.tv_sec) + end.tv_usec - start.tv_usec;

        printf("seconds: %d us\n", timeuse);


        return 0;
}

:102334155
seconds: 23 us

或者 使用 time + ./执行文件 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/vevenlcf/article/details/46909273

智能推荐

【HTTP】Fiddler(二) - 使用Fiddler做抓包分析_3)使用fiddler分析http请求-程序员宅基地

文章浏览阅读262次。转载:https://blog.csdn.net/ohmygirl/article/details/17849983上文( http://blog.csdn.net/ohmygirl/article/details/17846199 )中已经介绍了Fiddler的原理和软件界面。本文主要针对Fiddler的抓包处理。Fiddler抓取HTTP请求。抓包是Fiddler..._3)使用fiddler分析http请求

Ceres 详解(一) Problem类_对‘ceres::problem::addparameterblock(double*, int, -程序员宅基地

文章浏览阅读4.1k次,点赞6次,收藏55次。引言Ceres 是由Google开发的开源C++通用非线性优化库(项目主页),与g2o并列为目前视觉SLAM中应用最广泛的优化算法库(VINS-Mono中的大部分优化工作均基于Ceres完成)。Ceres中的有限边界最小二乘问题建模为以下形式:Ceres的求解过程包括构: 建最小二乘和求解最小二乘问题 两部分,其中构建最小二乘问题的相关方法均包含在Ceres::Problem类中,涉及的成员函数主要包括 Problem::AddResidualBlock()和 Problem::AddP_对‘ceres::problem::addparameterblock(double*, int, ceres::localparameteriza

2022哈工大计算机系统大作业_郭仁恺-程序员宅基地

文章浏览阅读265次。摘 要本文分析了hello程序的整个运行生命周期。首先编写hello.c源程序,之后运行C预处理器对其进行预处理,得到hello.i文件,运行C编译器将翻译生成汇编语言文件hello.s,然后运行汇编器将其翻译成一个可重定位目标文件hello.o,最后运行链接器程序将hello.o和系统目标文件组合起来,就可以创建一个可执行目标文件hello。在shell接收到输入的./hello的指令后开始调用fork函数创建进程,execve加载hello进入内存,由CPU控制程序逻辑流的运行,中断,上下文切换和._郭仁恺

【C/C++】JAVA与C/C++ AES加密算法同步_botan c++ aes java 互通-程序员宅基地

文章浏览阅读4.6k次。此处我们使用的是AES的基础加密模式,即:电码本模式 ECBJAVA代码如下: //创建AES加密实例 SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES"); Cipher cip = Cipher.getInstance("AES/ECB/NoPadding");//算法/模式/补码方式 cip.init(C_botan c++ aes java 互通

民工哥折腾了2年多的《Linux系统运维指南》终于和大家见面了_linux系统运维指南:从入门到企业实战 pdf-程序员宅基地

文章浏览阅读2.5k次,点赞5次,收藏17次。2018年3月,我与张老师就这么在微信上聊了起来,起初我并没有写书的打算,我们之间只是通过讨论、交流的形式聊聊关于出书的方方面面。最终,敌不过张老师超强的专业能力、细致的解说与盛情相邀,我答应张老师写一本Linux系统运维的图书并由人邮出版。由此,我踏上了漫漫2年多的写书之路。为什么写这本书写书一方面是我对自己所学知识的查漏补缺过程,另一方面也可以向即将进入或已经入行的Linux系统运维同..._linux系统运维指南:从入门到企业实战 pdf

tf.reduce_sum()方法深度解析-程序员宅基地

文章浏览阅读2k次,点赞6次,收藏5次。tf.reduce_sum()函数深度解析从矩阵,数组,数据存储的角度 解析axis参数的意义_tf.reduce_sum

随便推点

MSE(均方误差)函数和RMSE函数-程序员宅基地

文章浏览阅读10w+次,点赞41次,收藏141次。 _rmse函数

模糊搜索数组_可搜索的下拉菜单,你见过吗?2步搞定,不要太简单!-程序员宅基地

文章浏览阅读370次。秋叶 PPT 双 12 大促年终盛典全场精品课享年度超值价买课赠书最高立省 801本文作者:小爽本文审核:玛奇鹅本文编辑:竺兰大家好,我是继续挖掘 Excel 各种技巧的小爽~在工作中,我们经常需要在 Excel 中填写一些固定选项的数据。对于「懂点 Excel」的小伙伴来说,一般会选择用【数据验证】的功能制作下拉列表。不过一旦数据选项过多,用下拉列表选择还是会显得比较麻烦,手还很累。..._isnumber(find(cell("contents")

学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯_stm32定时器实现一个按键切换四个模式-程序员宅基地

文章浏览阅读888次。学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯_stm32定时器实现一个按键切换四个模式

旧服务器如何虚拟化,4个步骤教你如何重复利用旧虚拟化主机-程序员宅基地

文章浏览阅读1.2k次。VMware ESX 3.0已经发布了三年多时间,目前有很多用户希望升级到VMware最新的vSphere 4.0虚拟化平台,而大量运行ESX 3.0的服务器也到了需要更新换代的时刻。这些运行了三年ESX 3.0的老旧服务器虽然已经不能完全满足未来快速增长的负载需求,但还是具有不小的性能空间,将这一大批当时非常昂贵的服务器关闭弃之不用,确实显得有些浪费。为了不将老旧的虚拟化主机丢弃在角落,很多企业..._旧服务器虚拟化

(js) 字符串和数组的常用方法-程序员宅基地

文章浏览阅读132次。JS中字符串和数组的常用方法JS中字符串和数组的常用方法 js中字符串常用方法 查找字符串 根据索引值查找字符串的值 根据字符值查找索引值 截取字符串的方法 字符串替换 字符串的遍历查找 字符串转化为数组 ..._js根据索引查找字符串

hadoop大数据-HDFS分布式文件系统及高可用_hdfs实现高可用文件存储-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏9次。系列文章目录hadoop大数据-HDFS分布式文件系统hadoop大数据-HDFS分布式文件系统系列文章目录一、hadoop简介二、Hadoop的搭建2.1本地独立模式2.1伪分布式模式的搭建完成分布式的搭建完全分布式的环境搭建完全分布式的配置hadoop结点扩容四、HDFS工作原理一、hadoop简介大数据主要两个点:分布式存储以及分布式计算,基本上计算的调度跟着存储走,因为迁移存储的成本高于计算大数据是个生态,本次学习Hadoop的HDFS分布式文件系统MapReduce离线计算GF_hdfs实现高可用文件存储

推荐文章

热门文章

相关标签