1. 程式人生 > >【演算法】費波那契數列演算法

【演算法】費波那契數列演算法

費波那契數列演算法

作者:白寧超

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\t"+str(fib(10000))) #0.1S
print(datetime.datetime.now())
print("2"+str(fib3(10000))) #0.8s
print(datetime.datetime.now())
#print("3\t"+str(fib1(30))) #3.4s
print(datetime.datetime.now())
#print("4\t"+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; } }

相關推薦

演算法數列演算法

費波那契數列演算法 作者:白寧超 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

C++數列前N項的和遞迴與非遞迴演算法

定義:斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、1

數列取模(大數)分治演算法

此中測試資料n是整數侷限內。 這個題目,主如果用到很關鍵的一個數學常識,斐波那契數列的求法,可以轉換為矩陣的連乘,矩陣的n此方演算法又可以用分治的演算法。 並且又有理論根據:(n*m)%c=[ (n%c)*(m%c) ]%c ; (n+m)%c=[ (n%c)+(m%c) ]%c ,所以過程中的成果可以

遞迴演算法數列的備忘錄優化

遞迴演算法之斐波那契數列的優化 閒來無事嘗試了一下斐波那契的遞迴演算法 遞迴的斐波那契數列的演算法的效率驚人的低 得到43個數據需要8秒鐘 而優化過帶備忘錄的斐波那契數列,只需要0.2秒就可以打出64個數據 2秒可打出1000個 說明了線性

Java數列前N項(堆疊演算法)

堆疊是一種很靈活的"後進先出"資料結構,使用堆疊可以節省記憶體的開銷。比如,遞迴是一種很消耗記憶體的演算法,可以藉助堆疊消除大部分遞迴,達到和遞迴演算法同樣的目的。 下面用例子實現求斐波那契數列前N項

數論數列求和公式

斐波那契數列: F(n)=F(n-1)+F(n-2); 其中,      F1=1, F2=1. 斐波那契數列求和公式:          Sn  =     2F(n)  +  F(n-1) -  1 Sn  =   F1 + F2 + F3 +……+ 

演算法之斐數列 演算法之斐數列

演算法之斐波那契數列 斐波那契數列 def fib(n): '''裴波那契''' f = [1,1] for i in range(2, n+1): f.append(f[-1]+f[-2])

演算法 in python | DP數列vs卡塔蘭數列

1. 斐波那契數列 公式: 應用:爬樓梯 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? class Solution: def climbStairs(self, n):

C語言數列的兩種演算法(迴圈,遞迴)

#include<stdio.h> int Fabio(int n) //迴圈 { int i; int f1 = 1; int f2 = 1; int f3 = 1; for(i = 2;i<n;i++) { f3 = f1 + f

劍指offer數列非遞迴求解第N項

public class Solution {    public int Fibonacci(int n) {       //錯誤輸入處理       if

劍指offer數列非遞歸求解第N項

非遞歸 acc 斐波那契 錯誤 bsp fibonacci 更新 off for public class Solution { public int Fibonacci(int n) { //錯誤輸入處理 if(n<0) return

劍指offer第七題數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 剛開始覺得輸入為一個數,然後找到這個數在斐波那契數列中的位置

hdu4549 M斐數列矩陣快速冪F[n] = F[n-1] * F[n-2] ,求F[n]

【連結】 【題意】 F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 給出a, b, n,求出F[n] 【分析】 寫出幾項後,發現:F[n]=a^x*b^y,x,y成斐波那契數列。 且有規律:ans=a^

劍指offer{7-10}數列、跳臺階、變態跳臺階、矩形覆蓋

斐波那契數列、跳臺階、變態跳臺階、矩形覆蓋題目描述C++程式碼跳臺階題目描述C++程式碼變態跳臺階題目描述C++程式碼矩形覆蓋題目描述C++程式碼 注:思路均是動態規劃,用中間陣列dp存放計算值,如果

JZOJ-senior-4627. NOIP2016提高A組模擬7.15數列

Time Limits: 1000 ms Memory Limits: 524288 KB Description Input Output Sample Input 5 10 Sample O

程式設計5數列 + 遞迴+LeetCode50

傳送門:https://leetcode-cn.com/problems/powx-n/ 一、LeetCode 50. Pow(x, n) 1、題目描述 實現 pow(x, n) ,即計算 x 的 n 次冪函式。 2、示例 示例 1: 輸入: 2.00000, 1

劍指offer數列 遞迴 迴圈 時間 c++

題目:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。n<=39 思路:可以用兩種方法實現,這裡遞迴的辦法因為有太多重複的計算會超時(計算n=39,需要4s左右,題目要求1s),遂改用迴圈語句寫(經測試n=39時,完全小於1s),下面的程式碼中也給

題10 斐數列

演算法和資料操作 • 遞迴和迴圈: 很多演算法可以用遞迴和迴圈兩種不同方式實現。 通常基於遞迴的實現方法程式碼會比較簡潔,但效能不如基於迴圈的實現方法。 • 排序和查詢: 重點掌握二分查詢,歸併排序和快速排序。 例 題11旋轉陣列的最小數字 • 回溯法: 要求在二維陣列(迷宮或棋盤)上搜索路

劍指offer數列問題

1、斐波那契數列 (Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在

遞迴和遞推演算法求斐數列(Fibonacci數列

一、遞迴演算法 import java.util.Scanner; //Fibonacci數列:1,1,2,3,5,8,... //求該數列第n個數的值。 //數列滿足遞迴公式:F1=1,F2+=1,Fn=Fn-1 + Fn-2 public class Fibonacci { pub