【算法】费波那契数列算法
费波那契数列算法
作者:白宁超
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; } }
作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。
出处:http://www.cnblogs.com/baiboy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。