动态规划-斐波那契数列求算
来源:互联网 发布:中国税务网络大学安装 编辑:程序博客网 时间:2024/05/23 02:00
-1. 先上基本解法,几乎是小白闭着眼都能写出的代码:
为了不产生指数级别的时间复杂度,只需要将中间过程中计算的斐波那契数列数值都记录下就可,改进代码如下:
/** * 斐波那契数列的实现类 * @author Gastby * */public class FormatTest { /** * 哈希表用来存放中间生成的的斐波那契数值 */ static HashMap<Integer, Long> map = new HashMap<Integer, Long>(); public static void main(String[] args) { PrintStream pw = System.out; int n = 50; pw.println(fb1(n)); //直接打印第50个斐波那契数列 pw.println(fb2(n)); pw.println(fb3(n)); } /** * 递归调用,求算中间第n个斐波那契数值 * @param n * @return */ private static Long fb1(int n) { if(n == 1) { if(map.containsKey(n)) //先判断是否已经存入了哈希表中 return map.get(n); else map.put(n, (long)1); return map.get(n); } else if(n == 2) { if(map.containsKey(n)) return map.get(n); else map.put(n, (long)1); return map.get(n); } else { long v1, v2; if(map.containsKey(n-1)) v1 = map.get(n-1); else { v1 = fb(n-1); map.put(n-1, v1); } if(map.containsKey(n-2)) v2 = map.get(n-2); else { v2 = fb(n-2); map.put(n-2, v2); } return v1 + v2; } }}
当然这样的做法太复杂了,其实根本用不着哈希表,只需要数组就可以解决问题。
-2. 数组自下向上求解第n个数值;
/** * 数组求解第n个斐波那契额数列数值 * @param n 输入的第n个数 * @return 返回该数值 */ private static int fb2(int n) { if(n == 1) return 1; else if(n == 2) return 1; else { int[] t = new int[n]; t[0] = 1; t[1] = 1; for(int i=2; i<n; i++) { t[i] = t[i-1] + t[i-2];// System.out.println(i + "--" + t[i]); } return t[n-1]; } }
- 但其实在只需要求解第n个斐波那契额数值的时候,你中间缺保留计算了n-1个不需要存储数,一定程度上造成了空间的浪费,所以如果真的从节省空间的角度考虑的化,代码可以从以下角度进一步优化。
-3. 只用两个变量就可计算得出最终第n个所需数值的代码如下,同样自下向上;
private static int fb3(int n) { int a1=1, a2=1; if(n == 1) return a1; if(n == 1) return a2; for(int k=2; k<n; k++) { if(k % 2 == 1) a1 = a1 + a2; if(k % 2 == 0) a2 = a1 + a2; } if(n % 2 == 0) return a1; return a2; }
阅读全文
0 0
- 动态规划-斐波那契数列求算
- 动态规划-斐波那契数列
- 动态规划--斐波那契数列
- 动态规划斐波那契数列
- 动态规划---斐波那契数列
- 动态规划之斐波那契数列
- C#动态规划计算斐波那契数列
- 斐波那契数列之动态规划
- 求解斐波那契数列的动态规划方法
- 动态规划——斐波那契数列
- 【算法】动态规划法(斐波那契数列)
- 从斐波那契数列窥探动态规划
- 动态规划的方法求解斐波那契数列
- 动态规划入门之求解斐波那契数列
- 动态规划入门-斐波那契数列的计算
- 动态规划8:斐波那契数列
- 70. Climbing Stairs -- 动态规划、斐波那契数列
- 动态规划求解裴波那契数列
- URAL
- 利比亚行动
- 从应用角度看Android源码
- CocoaPods更新后搜不到想要的框架
- JAVA基础(一)——重载(Overloading)与重写(Overriding)的区别
- 动态规划-斐波那契数列求算
- <8/11>集训日记
- Java 的发展历史, 现状与未来(完整总结, 20170811 更新)
- Search Insert Position leetcode java
- 架构师日记——VCL的变量和常用片段
- 我自己看的
- 多态
- ACL 访问控制列表
- ResNet