算法——动态规划篇——斐波那契数列

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了《斐波纳契数列》季刊,专门刊载这方面的研究成果。

以上内容来自百度百科。。

今天主要是想用动态规划的思想求解斐波那契数列,用来观察动态规划带来的优势,空间换时间,不重复求解

方法一采用的是常规的递归方式求解,会发现,在递归的过程中会有太多的重复性操作,比如说f5=f4+f3=(f3+f2)+(f2+f1)=((f2+f1)+(f1+f0))+((f1+f0+f1)),越到后面,基本上求解的都是重复性的解,采用动态规划,可以避免这一不足,同时还将已往的解保留了下来,提高了程序的效率。

代码:

package hello.ant;
//斐波那契数列应该是:0,1,1,2,3,5,8,13,21,34,55,89,144,233,...
//规律是:f[0]=0,f[1]=1,f[i]=f[i-1]+f[i-2],i>1

public class AlogFibonacci2 {
	public static void main(String[] args) {
		int n=40;
		long startTime=System.currentTimeMillis();
		System.out.println(fibonacci(n));
		System.out.println("\ntime:"+(System.currentTimeMillis()-startTime));
	}
	static int fibonacci(int i){
		if(i==0){
			return 0;
		}else if(i==1){
			return 1;
		}else {
			return fibonacci(i-1)+fibonacci(i-2);
		}
	}
}

结果如下:

102334155

time:1199

时间花的也比较多。

动态规划方式:

代码:

package hello.ant;
//斐波那契数列应该是:0,1,1,2,3,5,8,13,21,34,55,89,144,233,...
//规律是:f[0]=0,f[1]=1,f[i]=f[i-1]+f[i-2],i>1

public class AlogFibonacci {
	public static void main(String[] args) {
		int n=40;
		long array[]=new long [n+1];
		array[0]=0;
		array[1]=1;
		long startTime=System.currentTimeMillis();
		for(int i=2;i<n+1;i++){
			array[i]=array[i-1]+array[i-2];
		}
		for(int i=1;i<n+1;i++){
			System.out.print(array[i]+"  ");
		}
		System.out.println("\ntime:"+(System.currentTimeMillis()-startTime));
	}
}

结果如下:

1  1  2  3  5  8  13  21  34  55  89  144  233  377  610  987  1597  2584  4181  6765  10946  17711  28657  46368  75025  121393
 196418  317811  514229  832040  1346269  2178309  3524578  5702887  9227465  14930352  24157817  39088169  63245986  102334155

time:1

两者相比较,差距还是很大的啊。。

动态规划空间换时间,不重复求解,这一特性表现的很突出。。。

算法——动态规划篇——斐波那契数列,布布扣,bubuko.com

时间: 2024-10-13 21:19:53

算法——动态规划篇——斐波那契数列的相关文章

算法——动态规划篇——斐波那契数

契数列,又称黄金切割数列.指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上.斐波纳契数列以例如以下被以递归的方法定义:F0=0.F1=1,Fn=F(n-1)+F(n-2)(n>=2.n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此.美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. 以上内容来自百度百科.. 今天主要是想用动态规划的思想求解斐波那契数列.用来观察动态规划带来的优势,空间换时间.不反复求解

动态规划之斐波那契数列

动态规划之斐波那契数列 动态规划是将一个问题切分成子问题并将子问题的结果存储起来避免重复计算的一种算法. 它有两个要件: 1)重复子问题 2)最优子结构 和分治法一样,动态规划也是有自己的子问题,所以如果没有重复子问题,那么动态规划就无法使用,因为动态规划的作用就是存储重复子问题的值:反例是,二分查找,在二分查找中,并没有重复子问题. 在斐波那契数列中,fib(3)被计算多次,如果我们能够存储fib(3)的值,则可以优化算法. 接下来有两种算法来优化问题: 1)Memoization (备忘录)

高级算法——动态规划(斐波那契函数实例)

//使用递归去解决问题虽然简洁, 但效率不高,转为动态规划较好 function recurFib(n) {//斐波那契数列——递归 if (n <= 2) { return 1; } else { return recurFib(n - 1) + recurFib(n - 2); } } function dynFib(n) {//斐波那契数列——动态规划 var val = []; if (n == 1 || n == 2) { return 1; } else { val[1] = 1;

16、【常见算法】查找斐波那契数列的第N项

问题:手写一个函数,用于查找斐波那契数列的第N项目 1 /* 2 查找斐波那契数列的第N个数 3 */ 4 #include <iostream> 5 6 using namespace std; 7 8 int Find(int n) 9 { 10 int a, b; 11 a = 0; 12 b = 1; 13 14 15 for(int i = 1; i < n; i++) 16 { 17 int c = a + b; 18 a = b; 19 b = c; 20 } 21 ret

JavaScript算法系列之-----------------斐波那契数列(JS实现)

题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 递归实现: function Fibonacci(n){ if(n<0){ return -1; } if(n===0){ return 0; } if(n===1){ retunr 1; } if(n>1){ return Fibonacci(n-1)+Fibonacci(n-2); } } 递归实现效率较低,未能编译通过. 正常实现: function Fib

Java与算法之(3) - 斐波那契数列

斐波那契数列问题:如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第三个月里,又能开始生1对小兔子,假定在不发生死亡的情况下,由一对初生的兔子开始,1年后能繁殖出多少对兔子? 首先手工计算来总结规律,如下表注意总数这一列 1+1=2 1+2=3 2+3=5 3+5=8 5+8=13 可以得出规律,第n个斐波那契数=第n-1个斐波那契数+第n-2个斐波那契数 为了计算n,必须计算n-1和n-2:为了计算n-1,必须计算n-2和n-3:直到n-x的值为1为止,这显示是递归大显身手的地方.来看代

算法题4 斐波那契数列

题目: Fibonacci数列定义如下: 输入n,求f(n) 分析: 在剑指offer上有个O(logn)的算法,本文只做O(n)算法的分析.这其实是一个简单的动态规划问题,问题的结果跟子问题的结果相关,关系式已经给出了,计算中需要保存子问题的结果 跳台阶问题:一个台阶一共有n阶,一次起跳可以跳一阶,也可以跳二阶.问总共有多少中跳法,并对时间复杂度进行分析.该问题也是典型的Fibonacci数列问题,第一次跳1个台阶,接下来有f(n-1)中跳法,第一次跳2个台阶,则接下来有f(n-2)个跳法.

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

Java 兔子问题(斐波那契数列)扩展篇

Java兔子问题(斐波那契数列)扩展篇 斐波那契数列指的是这样一个数列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...对于这个数列仅仅能说将兔子生产周期第为3月.假设生成周期变成4月这个数列肯定不是这种,或者说兔子还有死亡周期,在这里我是对兔子生产周期没有限定.仅仅要月份大于生产周期都能够计算出第month月份究竟能产生多少对兔子. Java兔子生殖问题 斐波那契数列又因数学家列昂纳多·斐波那契以兔子生殖为样例而引入.故又称为"兔子数列"