做者:白寧超java
2016年10月27日20:06:54算法
F0 = 0 (n=0)app
F1 = 1 (n=1)code
Fn = F[n-1]+ F[n-2](n=>2)blog
分析:當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())
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; } }
#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; }
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; } }