Fibonacci数列

一、斐波那契数列 

斐波纳契数是以下整数序列中的数字。

0,1,1,2,3,5,8,13,21,34,55,89,144 ......

在数学术语中,斐波那契数的序列Fn由递归关系定义

\large F n = F n-1 + F n-2               \large F0 = 0 and F1 = 1.

fibonacci-sequence

二、斐波那契数列的实现 

方法1(使用递归)
一种简单的方法,它是上面给出的直接递归实现数学递归关系。

如给定数n=8,打印第n个Fibonacci数。

C:

//Fibonacci Series using Recursion 
#include<stdio.h> 
int fib(int n) 
{ 
   if (n <= 1) 
      return n; 
   return fib(n-1) + fib(n-2); 
} 
  
int main () 
{ 
  int n = 8; 
  printf("%d", fib(n)); 
  getchar(); 
  return 0; 
} 
Java:


//Fibonacci Series using Recursion 
class fibonacci 
{ 
    static int fib(int n) 
    { 
    if (n <= 1) 
       return n; 
    return fib(n-1) + fib(n-2); 
    } 
       
    public static void main (String args[]) 
    { 
    int n = 8; 
    System.out.println(fib(n)); 
    } 
} 
/* This code is contributed by Rajat Mishra */

 

Python:


# Function for nth Fibonacci number 
  
def Fibonacci(n): 
    if n<0: 
        print("Incorrect input") 
    # First Fibonacci number is 0 
    elif n==1: 
        return 0
    # Second Fibonacci number is 1 
    elif n==2: 
        return 1
    else: 
        return Fibonacci(n-1)+Fibonacci(n-2) 
  
# Driver Program 
  
print(Fibonacci(8)) 
  
#This code is contributed by Saket Modi

 

C#:


// C# program for Fibonacci Series  
// using Recursion 
using System;  
  
public class GFG  
{  
    public static int Fib(int n)  
    {  
        if (n <= 1)  
        {  
            return n;  
        }  
        else
        {  
            return Fib(n - 1) + Fib(n - 2);  
        }  
    }  
          
    // driver code 
    public static void Main(string[] args)  
    {  
        int n = 8; 
        Console.Write(Fib(n));  
    }  
}  
  
// This code is contributed by Sam007 
PHP:

<?php 
// Fibonacci Series  
// using Recursion 
  
// function returns  
// the Fibonacci number 
function fib($n) 
{ 
    if ($n <= 1) 
        return $n; 
    return fib($n - 1) +  
           fib($n - 2); 
} 
  
// Driver Code 
$n = 8; 
echo fib($n); 
  
// This code is contributed by aj_36 
?> 

 时间复杂度: T(n)= T(n-1)+ T(n-2)是指数的。
我们可以观察到这个实现做了很多重复的工作(参见下面的递归树)。所以这对于第n个Fibonacci数是一个糟糕的实现。

  fib(5)    
                     /                   
               fib(4)fib(3)    
             / /      
         fib(3)fib(2)fib(2)fib(1)
        / / /       
  fib(2)fib(1)fib(1)fib(0) fib(1)fib(0)
  /     
fib(1)fib(0)

空间:如果我们考虑函数调用堆栈大小,则为O(n),否则为O(1)。

方法2(使用动态编程)

C:


//Fibonacci Series using Dynamic Programming 
#include<stdio.h> 
  
int fib(int n) 
{ 
  /* Declare an array to store Fibonacci numbers. */
  int f[n+2];   // 1 extra to handle case, n = 0 
  int i; 
  
  /* 0th and 1st number of the series are 0 and 1*/
  f[0] = 0; 
  f[1] = 1; 
  
  for (i = 2; i <= n; i++) 
  { 
      /* Add the previous 2 numbers in the series 
         and store it */
      f[i] = f[i-1] + f[i-2]; 
  } 
  
  return f[n]; 
} 
  
int main () 
{ 
  int n = 9; 
  printf("%d", fib(n)); 
  getchar(); 
  return 0; 
} 
Java:

// Fibonacci Series using Dynamic Programming 
class fibonacci 
{ 
   static int fib(int n) 
    { 
    /* Declare an array to store Fibonacci numbers. */
    int f[] = new int[n+2]; // 1 extra to handle case, n = 0 
    int i; 
       
    /* 0th and 1st number of the series are 0 and 1*/
    f[0] = 0; 
    f[1] = 1; 
      
    for (i = 2; i <= n; i++) 
    { 
       /* Add the previous 2 numbers in the series 
         and store it */
        f[i] = f[i-1] + f[i-2]; 
    } 
       
    return f[n]; 
    } 
       
    public static void main (String args[]) 
    { 
        int n = 9; 
        System.out.println(fib(n)); 
    } 
} 
/* This code is contributed by Rajat Mishra */

 

Pyhon:


# Fibonacci Series using Dynamic Programming 
def fibonacci(n): 
      
    # Taking 1st two fibonacci nubers as 0 and 1 
    FibArray = [0, 1] 
      
    while len(FibArray) < n + 1:  
        FibArray.append(0)  
      
    if n <= 1: 
       return n 
    else: 
       if FibArray[n - 1] ==  0: 
           FibArray[n - 1] = fibonacci(n - 1) 
      
       if FibArray[n - 2] ==  0: 
           FibArray[n - 2] = fibonacci(n - 2) 
      
       FibArray[n] = FibArray[n - 2] + FibArray[n - 1] 
    return FibArray[n] 
      
print(fibonacci(9)) 

 时间复杂度: O(n)
空间: O(n)

方法3(空间优化方法2)
我们可以通过存储前两个数字来优化方法2中使用的空间,因为这是我们获得下一个Fibonacci数串行所需的全部内容。

C:

// Fibonacci Series using Space Optimized Method 
#include<stdio.h> 
int fib(int n) 
{ 
  int a = 0, b = 1, c, i; 
  if( n == 0) 
    return a; 
  for (i = 2; i <= n; i++) 
  { 
     c = a + b; 
     a = b; 
     b = c; 
  } 
  return b; 
} 
  
int main () 
{ 
  int n = 9; 
  printf("%d", fib(n)); 
  getchar(); 
  return 0; 
} 

 

Java:


// Java program for Fibonacci Series using Space 
// Optimized Method 
class fibonacci 
{ 
    static int fib(int n) 
    { 
        int a = 0, b = 1, c; 
        if (n == 0) 
            return a; 
        for (int i = 2; i <= n; i++) 
        { 
            c = a + b; 
            a = b; 
            b = c; 
        } 
        return b; 
    } 
  
    public static void main (String args[]) 
    { 
        int n = 9; 
        System.out.println(fib(n)); 
    } 
} 
  
// This code is contributed by Mihir Joshi 
Python:


# Function for nth fibonacci number - Space Optimisataion 
# Taking 1st two fibonacci numbers as 0 and 1 
  
def fibonacci(n): 
    a = 0
    b = 1
    if n < 0: 
        print("Incorrect input") 
    elif n == 0: 
        return a 
    elif n == 1: 
        return b 
    else: 
        for i in range(2,n+1): 
            c = a + b 
            a = b 
            b = c 
        return b 
  
# Driver Program 
  
print(fibonacci(9)) 
  
#This code is contributed by Saket Modi 

 时间复杂度: O(n)
额外空间: O(1)

方法4(使用矩阵的幂{{1,1},{1,0}})
这另一个O(n)依赖于如果我们乘以矩阵M = {{1,1}的事实, {1,0}}自身(换句话说,计算功率(M,n)),然后我们得到第(n + 1)个斐波纳契数作为结果矩阵中行和列(0,0)的元素。

矩阵表示为Fibonacci数提供以下闭合表达式:

fibonaccimatrix

C:


#include <stdio.h> 
  
/* Helper function that multiplies 2 matrices F and M of size 2*2, and 
  puts the multiplication result back to F[][] */
void multiply(int F[2][2], int M[2][2]); 
  
/* Helper function that calculates F[][] raise to the power n and puts the 
  result in F[][] 
  Note that this function is designed only for fib() and won't work as general 
  power function */
void power(int F[2][2], int n); 
  
int fib(int n) 
{ 
  int F[2][2] = {{1,1},{1,0}}; 
  if (n == 0) 
      return 0; 
  power(F, n-1); 
  
  return F[0][0]; 
} 
  
void multiply(int F[2][2], int M[2][2]) 
{ 
  int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
  int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
  int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
  int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
  
  F[0][0] = x; 
  F[0][1] = y; 
  F[1][0] = z; 
  F[1][1] = w; 
} 
  
void power(int F[2][2], int n) 
{ 
  int i; 
  int M[2][2] = {{1,1},{1,0}}; 
  
  // n - 1 times multiply the matrix to {{1,0},{0,1}} 
  for (i = 2; i <= n; i++) 
      multiply(F, M); 
} 
  
/* Driver program to test above function */
int main() 
{ 
  int n = 9; 
  printf("%d", fib(n)); 
  getchar(); 
  return 0; 
} 

 

Java:

class fibonacci 
{ 
      
    static int fib(int n) 
    { 
    int F[][] = new int[][]{{1,1},{1,0}}; 
    if (n == 0) 
        return 0; 
    power(F, n-1); 
      
       return F[0][0]; 
    } 
       
     /* Helper function that multiplies 2 matrices F and M of size 2*2, and 
     puts the multiplication result back to F[][] */
    static void multiply(int F[][], int M[][]) 
    { 
    int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
    int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
    int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
    int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
       
    F[0][0] = x; 
    F[0][1] = y; 
    F[1][0] = z; 
    F[1][1] = w; 
    } 
  
    /* Helper function that calculates F[][] raise to the power n and puts the 
    result in F[][] 
    Note that this function is designed only for fib() and won't work as general 
    power function */
    static void power(int F[][], int n) 
    { 
    int i; 
    int M[][] = new int[][]{{1,1},{1,0}}; 
      
    // n - 1 times multiply the matrix to {{1,0},{0,1}} 
    for (i = 2; i <= n; i++) 
        multiply(F, M); 
    } 
       
    /* Driver program to test above function */
    public static void main (String args[]) 
    { 
    int n = 8; 
    System.out.println(fib(n)); 
    } 
} 
/* This code is contributed by Rajat Mishra */

 

Python:

# Helper function that multiplies
# 2 matrices F and M of size 2*2,
# and puts the multiplication
# result back to F[][]

# Helper function that calculates
# F[][] raise to the power n and
# puts the result in F[][]
# Note that this function is
# designed only for fib() and
# won’t work as general
# power function
def fib(n):
F = [[1, 1],
[1, 0]]
if (n == 0):
return 0
power(F, n – 1)

return F[0][0]

def multiply(F, M):

x = (F[0][0] * M[0][0] +
F[0][1] * M[1][0])
y = (F[0][0] * M[0][1] +
F[0][1] * M[1][1])
z = (F[1][0] * M[0][0] +
F[1][1] * M[1][0])
w = (F[1][0] * M[0][1] +
F[1][1] * M[1][1])

F[0][0] = x
F[0][1] = y
F[1][0] = z
F[1][1] = w

def power(F, n):

M = [[1, 1],
[1, 0]]

# n – 1 times multiply the
# matrix to {{1,0},{0,1}}
for i in range(2, n + 1):
multiply(F, M)

# Driver Code
if __name__ == “__main__”:
n = 8
print(fib(n))

# This code is contributed
# by ChitraNayal

 时间复杂度: O(n)
额外空间: O(1)

z海清
关注 关注
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划入门之求解Fibonacci数列
极客学长 | 极客学长Bravo
10-17 3039
动态规划入门之求解斐波那契数列斐波那契数列,除了可以用跟递归方法来处理,还可以使用动态规划方法(DP)来求解。区别在于,如果使用动态规划方法,中间结果要“缓存”起来,以备后续使用,就可以将时间复杂度优化为O(N)。具体做法就是将每次调用fibonacci(i)的结果“缓存”起来。在普通电脑上,递归版本生成第50项斐波那契数用时可能超过一分钟,而动态规划方法只需几毫秒就能产生第10000项斐波那契数。
Fibonacci数列(string大整数)
远方传来风铃
07-14 307
这个数列还是挺好理解的,只是相加的时候使用大整数相加比较麻烦,用string方便一些 在sum函数中我定义一个新的string作为相加后的结果输出然而不行,新定义的string奇怪的只有一个字符可以使用,在我的理解中就是作为变量带过去的string像很多层的瓶子然而新定义的string就像一个只有一层的瓶子,这样的结果那肯定是我对string理解不够,不过上网查也没说如何定义一个很多层的空瓶子
作业:用递归方法求Fibonacci级数,公式fib(n)=fib(n-1)+fib(n-2),(n>2),fib(1)=fib(2)=1
m0_57594834的博客
06-02 2181
注意返回值的书写格式。
以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoi...
weixin_33911824的博客
11-29 121
动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法。它的名字和动态没有关系,是Richard Bellman为了唬人而取的。 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解。动态规划的关键是用记忆法储存重复问题的答案,避免重复求...
Fibonacci数列斐波那契数列PPT学习教案.pptx
10-07
"Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...
java实现fibonacci数列学习示例分享(斐波那契数列)
09-04
主要介绍了fibonacci数列(斐波那契数列)示例,大家参考使用吧
c#斐波那契数列(Fibonacci)(递归,非递归)实现代码
09-05
斐波那契数列是一种经典的数学序列,其中每个数字是前两个数字的和。数列的前两个数字通常是0和1,之后的每个数字都是前两个数字相加得到的。斐波那契数列的前几项是1、1、2、3、5、8、13、21、34等。在计算机科学中...
python 实现斐波那契数列
06-08
# 题目:斐波那契数列。 # 程序分析:斐波那契数列Fibonacci sequence),从1,1开始,后面每一项等于前面两项之和。图方便就递归实现,图性能就用循环。
c++输出斐波那契数列示例分享
09-04
主要介绍了c++输出斐波那契数列示例,需要的朋友可以参考下
Fibonacci数列的求解之动态规划
wx805541464的专栏
10-06 616
无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。 1.解法:使用一个数组来记录各个子问题的解(自顶向下),数组最开始要初始化为0. public class Fibonacci { static ArrayList list=new ArrayList(); public static void main(String[] args) {
LeetCode - Fibonacci Sequence/Dynamic Programming - Climbing Stairs
小熊糖否——木子兮的自留地
08-13 920
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Fibonacci数列简单动态规划
qq_30629571的博客
03-30 436
之前在遇到Fibonacci数列的一般解法都是利用递归,递推的最大问题就是大量的重复计算,十分影响速度 下例是一个简单的动态规划,以一定的空间代价避免代价更大的重复计算的栈空间浪费public class Solution { public int Fibonacci(int n) { if(n<=1) return n; int[
斐波那契
dongfangyueguang的博客
06-04 955
Document //1+1=2 //1+2=3 //2+3=5; //3+5=8 把第二个盒子的值给第一个盒子; 把第三个盒子的值给第二个盒子
斐波那契数列fibonacci
心流的博客
04-24 575
#!/usr/bin/python3# 斐波那契数列循环方式:l=[]a=0b=1i=1while i&lt;=10:    i+=1    print(b)    l.append(b)    a,b=b,a+b#斐波那契数列递归方式:def fibonacci(n):    if n==1 or n==2:        return 1    else:        return fibo...
python计算第n个斐波那契数_计算第n个斐波那契数
weixin_39530269的博客
12-08 1290
方法一:传统递归法时间复杂度O(2^n),空间复杂度O(n)计算Fibonacci(10)十次平均用时0.0003s 计算Fibonacci(100)单次用时大于1min时间复杂度极高,当n>35左右时间已经无法接受defFibonacci(n):if n == 1 or n == 2:return 1return Fibonacci(n - 1) + Fibonacci(n - 2)...
fibonacci数列python_从 Python 计算 Fibonacci 数列说起
weixin_39792747的博客
12-04 275
从 Python 计算 Fibonacci 数列说起09 Oct, 2012编程语言之争,争到最后大都就是在争论速度了,速度当然很重要,毕竟现实的物理设备和人类的想象力之间差距还是蛮大的,然而比较矛盾的是,越接近人类思维的语言就和计算机硬件隔的越远,速度也必然会受到影响,不过我才不去谈各种语言运行速度呢,这该多无聊啊。下面只是通过一个使用 Python 计算 Fibonacci 数列的例子来乱谈一...
斐波那契数列第n个数的值
想涨点访问呀!!!
12-25 1217
斐波那契问题: 引入: 斐波那契数列Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会
fibonacci 数列(数组实现) 分数 5 作者 lsr 单位 枣庄学院 斐波那契数列(fibonacc
最新发布
11-08
斐波那契数列的前两个数字是0和1,从第三个数字开始,每个数字都是前两个数字的和。即:F0 = 0,F1 = 1,Fn = Fn-1 + Fn-2,其中n ≥ 2。 可以使用数组来实现斐波那契数列。首先,定义一个大小为n+1的数组fib,用来...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

分类专栏

  • 排序算法 3篇
  • 操作系统 1篇
  • 算法 5篇
  • JAVA 17篇
  • 数据库 33篇
  • Coding 12篇
  • 深度学习 5篇
  • 总结 45篇
  • 问题 11篇
  • 技术 8篇

最新评论

  • Watershed segmentation 分水岭分割

    weixin_42624993: 现在的版本要 from skimage.segmentation import watershed 才行 换位置了

  • ERROR:ORA-01756: 引号内的字符串没有正确结束

    y489615823: 想问下更改成ANSI编码后报错部分变成了乱码,怎么更改重新写入呢?

  • Watershed segmentation 分水岭分割

    wzw1316492123: 我得from skimage.morphology import watershed会报错,找不到watershed这个函数

  • VS中安装.nupkg文件

    Mr.Nike: 右上角

  • VS中安装.nupkg文件

    Mr.Nike: 太棒了!感谢博主!

大家在看

  • 从零开始:STM32与W25Q64 Flash存储器的SPI接口全解析
  • STM32微控制器的SPI通信:硬件与软件实现W25Q64 Flash读写 165
  • STM32教程 使用硬件SPI和模拟SPI驱动W25Q64芯片 286

最新文章

  • 操作系统:页面替换算法
  • 2020研究生数学建模题目
  • 希尔排序
2020年42篇
2019年74篇
2018年36篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司观澜推广网站大芬网站开发龙华网站开发大浪网站制作大芬网站优化软件大鹏品牌网站设计坪山营销网站深圳网站搭建双龙设计网站东莞SEO按天计费广州seo优化丹竹头网站优化按天计费福永网站优化排名民治网络营销大芬百度爱采购石岩网页设计双龙营销网站木棉湾网站关键词优化福永网站优化推广大鹏企业网站改版惠州推广网站广州建站石岩网站推广南山百度竞价西乡百姓网标王推广罗湖营销网站深圳营销网站双龙关键词按天扣费木棉湾网站开发平湖网站建设设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化