`
angellin0
  • 浏览: 115428 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

斐波纳契数列编程实现

阅读更多
斐波纳契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。
     当n = 0, fib(n) = 1;
     当n = 1, fib(n) = 1;
     当n > 1, fib(n) = fib(n-1) + fib(n-2)
     解法1:
          直接根据数列描述,由递归的方式解决。
     
  1 def fib(a):
  2     assert a >=0
  3     if a in [0, 1]:
  4         return 1
  5     else:
  6         return fab(a-1) + fab(a-2)
     运行即可正确得出结果。但是细心的你会发现,如果求一个稍微大一点的数字的fib, 则系统会卡死。比如fib(100)。这是因为使用递归的方式计算时,会出现多次重复计算的过程,而这些重复计算消耗了大量的计算资源。
     于是最直接能想到的解决方法就是将之前的计算结果缓存起来,于是得到如下解决方案——
     解法2:
   
  1 dcache = {0:1, 1:1}
  2 def fib2(a):
  3      global dcache
  4      if a in dcache.keys():
  5           return dcache[a]
  6      else:
  7           dcache[a] = fab3(a-1) + fab3(a-2)
  8      return dcache[a]
   这样做是一个典型的以空间换取时间的做法,但是如果数字再大一点,使得dcache中存储的内容超过系统内存时,又会出现卡死的现象了。那么,还有没有更优化一点的方法呢?
     解法3:
 
  1 def fib3(a):
  2      fa, fb = 0, 1
  3      for i in xrange(a):
  4          fa, fb = fb, fa + fb
  5      return fb
     显然,第三种解法以递归的方式计算,既避免了迭代所导致的重复计算,又取消了全局缓存,使得计算效率更高。
 
     普及:
     一台4G内存的电脑,stack size设置为8192 (ulimit -a), 则最大可以跑512个线程(4G/8M)
0
0
分享到:
评论
5 楼 rainsilence 2013-04-08  
angellin0 写道
rainsilence 写道
为啥要用递归呢?

递归是从题目直译出来的结果,也是常人最直接的思维方式


用你的递归方法,参数设成40就跑不动了
4 楼 angellin0 2013-04-08  
rainsilence 写道
为啥要用递归呢?

递归是从题目直译出来的结果,也是常人最直接的思维方式
3 楼 alvin198761 2013-02-22  
        int a = 1;
        int b = 1;
        int c;
        for (int i = 2; i < 10; i++) {
            c = a + b;
            a = b;
            b = c;
            System.out.println(c);
        }
2 楼 alvin198761 2013-02-22  
int foo[] = new int[10];
foo[0] =1;
foo[1] =1;
for(int i=2;i < foo.length;i++){
foo[i] = foo[i-1]+foo[i-2];
}
1 楼 rainsilence 2013-02-21  
为啥要用递归呢?

相关推荐

    java实现Fibonacci数列

    根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这...通过学习这两种方法,我们可以更好地理解和掌握Fibonacci数列的相关知识,并将其应用于实际编程项目中。

    java斐波那契数列编程

    java斐波那契数列编程,是运用数组来创建的文档,输出一系列数.

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

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

    Fibonacci_VERILOGfibonacci_实现斐波拉切数列_

    在计算机科学中,特别是硬件描述语言(HDL)如Verilog中,斐波那契数列的实现是一个常见的练习,用于学习和展示并行和串行计算的概念。 Verilog是一种广泛使用的硬件描述语言,它允许工程师用类似于编程语言的方式...

    MIPS汇编实验:斐波那契数列

    在这个"MIPS汇编实验:斐波那契数列"中,我们主要关注的是如何使用C语言和MIPS汇编来实现斐波那契数列的计算,并进行溢出和输入检测。斐波那契数列是由两个前一个数相加得到的数列,通常以0和1开始。 首先,我们看...

    递归方法实现斐波那契数列_递归方法实现斐波那契数列_python_源码

    递归方法是实现斐波那契数列的一种常见方式。在编程中,递归是指函数调用自身来解决问题的方法。在这个场景下,我们可以编写一个函数,它会根据斐波那契数列的定义来计算第n项的值。 Python中递归实现斐波那契数列...

    java代码实现斐波那契数列输出第n个数

    在Java编程中,实现斐波那契数列有多种方法,包括递归、循环和动态规划等。递归方法虽然直观,但效率较低,因为它会进行大量的重复计算。循环方法和动态规划则通过存储中间结果避免了重复计算,提高了效率。 以下是...

    利用Matlab程序计算斐波那契数列的前一百项

    斐波那契数列是一个经典的...总之,利用MATLAB编程计算斐波那契数列是一项基础且实用的任务,它涉及到数组操作、循环控制以及数值或符号计算。理解并掌握这种计算方法有助于深入理解和应用数学序列在实际问题中的应用。

    mips汇编语言实现斐波那契数列的排列

    MIPS汇编语言实现斐波那契数列的排列 本资源使用MIPS汇编语言在Mars环境下实现斐波那契数列的排列,并输出前n项的下标、十进制数值和十六进制数值。 知识点总结: 1. MIPS汇编语言基础知识:MIPS汇编语言是一种...

    Fibonacci数列(非递归的函数调用)

    在编程中,特别是C++中,有多种方法可以实现计算斐波那契数列的第n项。非递归的函数调用方式通常比递归更有效率,因为它避免了重复计算和堆栈调用的开销。以下是一种使用循环的非递归方法: ```cpp #include using...

    【C++】斐波那契数列应用的一个实例

    【C++】斐波那契数列应用的一个实例。这是关于斐波那契数列的一个例子,用C++语言实现

    简单K阶斐波那契数列程序

    在这个C语言程序中,开发者设计了一个实现K阶斐波那契数列的方法。编写自己的程序而不是直接复制他人的代码,这展示了对编程基本技能的理解和掌握,以及独立思考的能力。C语言是一种底层的、结构化的编程语言,适合...

    斐波纳契数列编程解决方法

    斐波那契数列在编程中的应用广泛,例如用于测试算法效率、数据结构优化等。 在C++中,有多种方法来实现斐波那契数列,下面我们将详细介绍标题和描述中提到的三种方法:递归函数法、动态数组法和非递归函数法。 **1...

    斐波那契数列c++.pdf

    在计算机科学领域,利用C++等编程语言实现斐波那契数列生成不仅是学习递归算法和数据结构的好例子,也是理解算法复杂性的重要途径之一。通过对斐波那契数列的研究,不仅可以加深对数学的理解,还能拓宽在其他领域的...

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

    在本文中,我们将深入探讨如何使用汇编语言来计算斐波那契数列的前22项,并且对比两种不同的实现方法:递归调用和普通循环加法。首先,让我们了解一下斐波那契数列的基本概念。 斐波那契数列是一个数学上的序列,...

    斐波那契数列(c#.net源码).rar

    这个压缩包文件"斐波那契数列(c#.net源码).rar"包含了一个使用C#编程语言实现的.NET框架下的斐波那契数列计算程序。 斐波那契数列的定义是这样的:序列中的每个数字是前两个数字的和,通常以0和1开始,即F(0) = 0...

    斐波那契数列的实现算法及分析.docx

    斐波那契数列的实现算法及分析 斐波那契数列是一种经典的数列,定义为 F0=1,F1=1,F2=2,F3=3,F4=5,…,Fi=Fi-1+Fi-2(i&gt;1)。在计算机科学中,斐波那契数列的实现是一个经典的算法问题。该实验的主要目的是掌握...

    字符串匹配和斐波那契数列汇编_字符串匹配斐波那契数列汇编语言_

    在IT领域,汇编语言是一种低级编程语言,它与...通过分析"kmp算法.asm"和"斐波那契数列.asm"这两个文件,我们可以学习到如何在低级别层面上实现这些复杂算法,这对于提升编程技能和理解计算机工作原理具有重要意义。

    C语言解答经典的数学问题兔子繁衍问题即斐波那契数列问题

    斐波那契数列是一个非常著名...通过迭代或递归方式实现斐波那契数列的计算是计算机科学教育中常见的练习,有助于学生理解和掌握算法以及控制流程的概念。同时,这也是一种直观地展示如何用编程语言解决实际问题的方法。

Global site tag (gtag.js) - Google Analytics