`

斐波那契数列算法

阅读更多

首先介绍一下什么是斐波那契数列:1,1,2,3,5,8,13,21…… ,可以看到这里面的规律吧.就是每一项是前面相邻两项之和.
网上有很多的这样的算法来计算第n位的值,我再次只是想比较一下他们的优劣来提供一下参考.
先介绍递归法吧,因为我发现好多面试题里面都提到要用递归法来实现.
为了考虑知识层次的不同,我先来帮大家查一下什么是递归,百度知识里面是这样定义的:
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策 略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出 的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
看一个最普遍的用法:
1        static int GetNumberAtPos(int pos)
2        {
3            if (pos == 0 || pos == 1)
4            {
5                return 1;
6             }
7            int res = GetNumberAtPos(pos - 1) + GetNumberAtPos(pos - 2);
8            return res;
9         }
此算法的算法复杂度相对的大,如果感兴趣的朋友可以运行一下它,让得到第100位的数值,你会发现运行了半天还是没有出来结果,我来分析一下具体的原 因.pos100=pos99+pos98,接着我们分别计算pos99=pos98+pos97和pos98=pos97+pos96,不知道您发现了 没有,这里的pos98会在接下来的计算2次,而pos97会被计算3次,看个图理解一下吧


 
大家试想一下这个算法复杂度,指数倍增吧!
我们做个改良吧
1        static Int64 GetNumberAtPos(int pos)
2        {
3            return GetNumberAtPos(1, 1, 3, pos);
4         }
5        static Int64 GetNumberAtPos(Int64 fist, Int64 second, int num, int pos)
6        {
7             Int64 third = fist + second;
8            if (num < pos)
9            {
10                 Int64 next = GetNumberAtPos(second, third, ++num, pos);
11
12             }
13            else
14            {
15                 Console.WriteLine(third.ToString());
16             }
17            return third;
18
19         }
这个也算是递归,也同样满足递归的定义,就是看起来难看点,不过运行速度上已经是明显的提升了,结果3736710778780434371, 的确这个数字不小.

当然我们也可以不用递归啊.
用数组来实现也是不错的,当然经过我测试,这个也是速度最快的.
1        static void GetNumberAtListPos(int pos)
2        {
3             Int64[] list = new Int64[pos];
4             list[0] = 1;
5             list[1] = 1;
6            for (int i = 2; i < pos; i++)
7            {
8                 list[i] = list[i - 1] + list[i - 2];
9             }
10
11             Console.WriteLine(list[pos-1].ToString());
12         }

 

  • 大小: 20.4 KB
分享到:
评论

相关推荐

    斐波那契数列算法分析.doc

    "斐波那契数列算法分析" 斐波那契数列是一种非常经典的数学概念,它的应用非常广泛,包括算法设计、生物学、经济学等领域。斐波那契数列的定义是:每个数都是前两个数的和,从第三个数开始,每个数都是前面两个数的...

    Labview实现递归:斐波那契数列

    斐波那契数列: 在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用...

    斐波那契数列算法分析.pdf

    斐波那契数列算法分析 斐波那契数列是数学中一个著名的数列,每个数都是前面两个数的和,从第三个数开始。这个数列的规律性是非常明显的,从第一个数1开始,每个数都是前面两个数的和。这个数列的数学表达式是F(n) ...

    Fibonacci数列斐波那契数列PPT学习教案.pptx

    "Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...

    经典斐波那契数列的算法实现教案.doc

    经典斐波那契数列的算法实现教案 在本教案中,我们将探讨经典斐波那契数列的算法实现,并将其与 FOR 循环构造相结合,培养学生的变通性思维能力和程序设计能力。 知识点1:FOR 循环构造 * FOR 循环是控制构造中...

    斐波那契数列常用算法.pdf

    本文在 C++ 中实现斐波那契数列算法有几种常见的方法; 递归算法 : 简单易懂,但效率低,因重复计算大量子问题。 迭代算法 :通过循环计算,避免了递归的重复计算,效率更高。 动态规划算法 : 利用数组存储计算...

    算法设计实验报告之多种方法求解斐波那契数列

    在这个算法设计实验报告中,主要关注的是通过不同的方法求解斐波那契数列,这是一种经典的计算机科学问题。斐波那契数列是由0和1开始,后面的每一项数字是前面两项数字的和,通常表示为F(n)。实验的目标是实现四种...

    PTA平台C++递归与记忆化递归求解斐波那契数列算法实现

    内容概要:本文介绍了在PTA平台上使用C++语言通过递归和记忆化递归的方法来计算斐波那契数列。首先详细讲解了标准递归函数的实现,然后指出了其存在的性能瓶颈。接着介绍了使用记忆化递归来优化算法的具体步骤和代码...

    斐波那契数列(前100项).rar

    1. **算法实现**:常见的编程语言如C语言,可以用来实现斐波那契数列的计算。有两种主要的方法:递归和非递归。 - **递归方法**:递归是最直观的实现方式,但效率较低,因为它会重复计算很多次相同的值。例如,用...

    (新课标)2020年高考数学 题型全归纳 斐波那契数列.doc

    斐波那契数列在算法和计算机科学中也有重要地位。它们常用于性能测试,如计算大数目的斐波那契数以分析算法的时间复杂度。同时,斐波那契数列的特性也被应用于优化问题,比如记忆化搜索或动态规划,以减少重复计算。...

    4阶斐波那契数列算法(使用循环队列实现)

    4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4,利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 &gt;200。

    非递归实现fibonacci数列

    使用C++非递归实现fibonacci数列,对正在学习算法的同学应该挺有帮助的

    递归算法算斐波那契数列

    ### 递归算法计算斐波那契数列 #### 知识点概览 1. **斐波那契数列定义** 2. **递归算法原理** 3. **递归函数设计** 4. **递归算法的时间复杂度分析** 5. **C语言实现递归斐波那契数列** #### 斐波那契数列定义 ...

    斐波那契数列几种算法分析.doc

    "斐波那契数列算法分析" 斐波那契数列是一种经典的算法问题,它的名称来自13世纪意大利数学家列昂纳多·斐波那契。该数列的定义是:每个数目都是前面两个数目的和,数列的前几个数目是:1, 1, 2, 3, 5, 8, 13, 21, ...

    算法-数论- 斐波那契数列(Fibonacci).rar

    - 在编码理论中,斐波那契数列出现在某些编码算法中,如Fibonacci编码。 - 在图形学中,斐波那契螺旋被用于创建自然和有机形状的模拟。 8. **数论上的性质**: - 斐波那契数的模p余数的规律(例如费马小定理和...

    算法-斐波那契数列(信息学奥赛一本通-T1159)(包含源程序).rar

    通过阅读和分析这些源代码,可以加深对斐波那契数列算法的理解,并提高编程能力。 在信息学奥赛中,解决斐波那契数列问题不仅能锻炼选手的逻辑思维和编程技巧,还能培养他们对算法优化和复杂度分析的敏感性,这对...

    编写函数f,功能是用递归的方法求斐波那契数列的第n项

    【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n项,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,...

    汉诺塔_汉诺塔_

    斐波那契数列中的每个数字是前两个数字的和,通常以0和1开始:0, 1, 1, 2, 3, 5, 8, ...。在`斐波那契迭代.py`和`斐波那契递归.py`文件中,可能会有如下两种实现方式: **迭代法:** ```python def fib_iterative...

    汇编语言,计算斐波那契数列的前22项,斐波那契数列,分别用两种方法:递归调用,普通循环加法

    在汇编语言中实现斐波那契数列,我们可以利用CPU的寄存器来存储数值,并通过控制流程指令(如跳转)来实现算法。接下来,我们将详细讨论两种方法。 1. **递归调用**: 递归是一种函数在其定义中调用自身的技术。在...

    斐波那契数列.pdf

    斐波那契数列(Fibonacci sequence)是数学中一个非常著名的数列,其特点是每一项数值都是前两项数值的和。通常情况下,斐波那契数列的第一项为0或1,第二项也为1,后续各项则根据定义递推得到。 **基本形式:** \...

Global site tag (gtag.js) - Google Analytics