题目:定义Fibonacci数列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,看到题目就能写出如下的递归求解的代码。
///////////////////////////////////////////////////////////////////////
// Calculate the nth item of Fibonacci Series recursively
///////////////////////////////////////////////////////////////////////
long long Fibonacci_Solution1(unsigned int n)
{
int result[2] = {0, 1};
if(n < 2)
return result[n];
return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
}
但是,教科书上反复用这个题目来讲解递归函数,并不能说明递归解法最适合这道题目。我们以求解f(10)作为例子来分析递归求解的过程。要求得f(10),需要求得f(9)和f(8)。同样,要求得f(9),要先求得f(8)和f(7)……我们用树形结构来表示这种依赖关系
f(10)
/ \
f(9) f(8)
/ \ / \
f(8) f(7) f(7) f(6)
/ \ / \
f(7) f(6) f(6) f(5)
我们不难发现在这棵树中有很多结点会重复的,而且重复的结点数会随着n的增大而急剧增加。这意味这计算量会随着n的增大而急剧增大。事实上,用递归方法计算的时间复杂度是以n的指数的方式递增的。大家可以求Fibonacci的第100项试试,感受一下这样递归会慢到什么程度。在我的机器上,连续运行了一个多小时也没有出来结果。
其实改进的方法并不复杂。上述方法之所以慢是因为重复的计算太多,只要避免重复计算就行了。比如我们可以把已经得到的数列中间项保存起来,如果下次需要计算的时候我们先查找一下,如果前面已经计算过了就不用再次计算了。
更简单的办法是从下往上计算,首先根据f(0)和f(1)算出f(2),在根据f(1)和f(2)算出f(3)……依此类推就可以算出第n项了。很容易理解,这种思路的时间复杂度是O(n)。
///////////////////////////////////////////////////////////////////////
// Calculate the nth item of Fibonacci Series iteratively
///////////////////////////////////////////////////////////////////////
long long Fibonacci_Solution2(unsigned n)
{
int result[2] = {0, 1};
if(n < 2)
return result[n];
long long fibNMinusOne = 1;
long long fibNMinusTwo = 0;
long long fibN = 0;
for(unsigned int i = 2; i <= n; ++ i)
{
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 840我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 966第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 575第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1065一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1417解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 723/****************************** ... -
堆排序
2012-08-16 14:24 888堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 836#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 750一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1709用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1154int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 804顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1030话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 892KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9785两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 1002算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 982假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 776很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1298题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7321、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n项,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,...
"Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...
C语言程序设计-用函数求fibonacci数列前n项的和;说明:fibonacci数列为数列的第一项值为1,第二项值也为1,从第三项开始,每一项均为其前面相邻两项的和;例如:当n=28时,运行结果:832039.c
斐波那契数列: 在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用...
根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这一主题。 ### Java实现Fibonacci数列 #### 1. Fibonacci数列简介 Fibonacci数列是一系列数字,其中每...
### Fibonacci数列的基础概念 Fibonacci数列是数学中一个经典的数列,以其独特的性质在计算机科学、数学分析等领域有着广泛的应用。该数列由0和1开始,之后每一项都是前两项的和。即:0, 1, 1, 2, 3, 5, 8, 13, 21,...
使用C++非递归实现fibonacci数列,对正在学习算法的同学应该挺有帮助的
该序列以意大利数学家 Leonardo Fibonacci 的名字命名,故称为斐波那契数列。该序列的特点是每个数字都是前两个数字的和,以此模式无限延续下去。 下面是斐波那契数列的JAVA解法,包括递归算法、循环算法、数组保存...
斐波那契数列是一个经典的数学概念,在计算机科学和编程领域有着广泛的应用。这个数列由0和1开始,后面的每一项数字都是前两项数字的和。换句话说,斐波那契数列的第n项(记作F(n))可以通过F(n-1)和F(n-2)来计算。...
斐波那契数列是计算机科学中一个经典的问题,它在算法设计和分析中具有重要的地位。这个压缩包包含两个C++源程序,分别使用递归法和非递归法来实现斐波那契数列的计算。接下来,我们将详细讨论这两个方法以及...
斐波那契数列,又称为兔子数列,是由13世纪意大利数学家斐波那契提出的一个数学序列。这个数列的特点是每一项都等于前两项之和,起始的两项为1。具体地,斐波那契数列可以用递归公式表示:F0 = 1, F1 = 1, Fn = Fn-1...
在这个MATLAB程序中,我们首先定义了斐波那契数列的前两项`fibonacci = [1, 2]`,然后通过`for`循环从第三项开始计算,直到第一百项。在每次循环中,我们使用`fibonacci(k)`存储当前项,它是前两项`fibonacci(k-1)`...
在本课程设计中,主题是使用汇编语言编写程序来计算Fibonacci数列的前n项。Fibonacci数列是一系列数字,其中每个数字是前两个数字的和,通常以0和1开始:0, 1, 1, 2, 3, 5, 8, 13, ...。这个设计任务旨在让学习者...
用java语言写的求求fibonacci数列第1000项的值,用的递归算法.是初学java练习递归的好素材.
利用计算机求斐波那契数列前200项,大整数相加,斐波那契数列第100项为218922995834555169026。
斐波那契数列(Fibonacci sequence)是数学中一个非常著名的数列,其特点是每一项数值都是前两项数值的和。通常情况下,斐波那契数列的第一项为0或1,第二项也为1,后续各项则根据定义递推得到。 **基本形式:** \...
斐波那契数列毕业设计论文斐波那契数列的应用本科论文.doc 斐波那契数列是数学中一个非常重要的概念,它自问世以来不断显示出它在数学理论和应用上的重要作用。该数列在现代物理、准晶体结构、生物、交通、化学等...
程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 在数学上,费波那契数列是以递归的方法来定义: F0 = 0 (n=0) F1 = 1 (n=1) Fn ...
利用递归数列求解著名的Fibonacci数列的各项,用户可自定义输入要求的第n项,输入后即可求出从0到n每一项Fibonacci的值。
本代码使用C++语言书写,编译环境VS2013。...斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 本代码是练习作品,如有错误或修改,请指正,感谢感谢。