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