標籤:非遞迴 row import text highlight str end stat out
費波那契數列演算法
白寧超
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,1for i in range(n-1):a,b= b,a+breturn a #遞迴演算法實現,其中n=0返回0,n=1返回1,n>=2返回之前兩項之和,時間複雜度O(nlgn)def fib12(n):if n == 0:return 0elif n == 1:return 1else: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.1Sprint(datetime.datetime.now())print("2"+str(fib3(10000))) #0.8sprint(datetime.datetime.now())#print("3\t"+str(fib1(30))) #3.4sprint(datetime.datetime.now())#print("4\t"+str(fib2(30)) #7.1sprint(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 hereint 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 hereint 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;}}
費波那契數列演算法