zoukankan      html  css  js  c++  java
  • 【算法】费波那契数列算法

    费波那契数列算法

    作者:白宁超

    2016年10月27日20:06:54


    斐波那契数学描述:

    F0 = 0     (n=0)

    F1 = 1    (n=1)

    Fn = F[n-1]+ F[n-2](n=>2)

    Python语言实现:

    分析:当n=0时为0,n=1时为1,n>2时,最后两数之和。由此可知,链表fibs初始化0,1;列表可以当做链表使用,具有负数索引特性,采用后两位数相加追加即可。

    import datetime
    
    #由于斐波那契特性前两首0,1,其后各项均为之前两数之和可知,时间复杂度O(n)
    def fib(n):
    fibs=[0,1]
    for i in range(n-2): #开始两项已知
    fibs.append(fibs[-2]+fibs[-1])
    return fibs[-1]
    
    #迭代实现,时间复杂度O(n)
    def fib1(n):
    a,b = 0,1
    for i in range(n-1):
    a,b= b,a+b
    return a
    
     
    
    #递归算法实现,其中n=0返回0,n=1返回1,n>=2返回之前两项之和,时间复杂度O(nlgn)
    def fib12(n):
    if n == 0:
    return 0
    elif n == 1:
    return 1
    else:
    return fib1(n-2)+fib1(n-1)
    # 递归进行初始化O(nlgn)
    def fib3(n):
    init = {0: 0, 1: 1}
    if not n in init:
    init[n]=fib2(n-2)+fib2(n-1)
    return init[n]
    
     
    
    print(datetime.datetime.now())
    #print("1	"+str(fib(10000))) #0.1S
    print(datetime.datetime.now())
    print("2"+str(fib3(10000))) #0.8s
    print(datetime.datetime.now())
    #print("3	"+str(fib1(30))) #3.4s
    print(datetime.datetime.now())
    #print("4	"+str(fib2(30)) #7.1s
    print(datetime.datetime.now())
    

    Java代码实现:

    class Ideone
    {
    public static void main (String[] args) throws java.lang.Exception
    {
    int fibnum=fib1(1000);
    System.out.println(fibnum);
    }
    //递归算法
    public static int fib(int n){
    if(n==0) return 0;
    else if(n==1) return 1;
    else return fib(n-1)+fib(n-2);
    }
    //非递归算法 public static int fib1(int n){ int a=0,b=1,temp=0; for(int i=0;i<n;i++){ temp=a; a=(a+b); b=temp; } return a; } }

      

    C语言代码实现:

    #include <stdio.h>
    int fib(int n);
    int main(void) {
    // your code goes here
    int fibnum=fib1(10);
    printf("%d",fibnum);
    return 0;
    }
    //递归算法 int fib(int n){ if(n==0) return 0; else if (n==1) return 1; else return fib(n-1)+fib(n-2); }

    //非递归算法 int fib1(int n){ int a=0,b=1,temp=0; for(int i=0;i<n;i++){ temp=a; a=(a+b); b=temp; } return a; }

      

    C#代码实现:

    public class Test
    {
    public static void Main()
    {
    // your code goes here
    int fibnum=fib1(10);
    Console.WriteLine(fibnum);
    }
    //递归算法 public static int fib(int n){ if(n==0) return 0; else if(n==1) return 1; else return fib(n-1)+fib(n-2); }

    //非递归算法 public static int fib1(int n){ int a=0,b=1,temp=0; for(int i=0;i<n;i++){ temp=a; a=(a+b); b=temp; } return a; } }
  • 相关阅读:
    DIY 作品 及 维修 不定时更新
    置顶,博客中所有源码 github
    openwrt PandoraBox PBR-M1 极路由4 HC5962 更新固件
    使用 squid 共享 虚拟专用网至局域网
    第一次参加日语能力测试 N5
    libx264 libfdk_aac 编码 解码 详解
    开发RTSP 直播软件 H264 AAC 编码 live555 ffmpeg
    MFC Camera 摄像头预览 拍照
    http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送
    plist 图集 php 批量提取 PS 一个个切
  • 原文地址:https://www.cnblogs.com/baiboy/p/6005395.html
Copyright © 2011-2022 走看看