标签:
斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值。
方法一:迭代
public static int iterativeFibonacci(int n) { //简单迭代 int a = 1, b = 1; for(int i = 2; i < n; i ++) { int tmp = a + b; a = b; b = tmp; } return b; }
方法二:简单递归
public static long recursionFibonacci(long n) { // 简单递归 if(n == 1 || n == 2) return 1; return recursionFibonacci(n-1) + recursionFibonacci(n-2); }
方法三:利用DP思想对方法二进行改进,即使用一个数组存储每次计算出的结果,防止重复计算。
public static int recursionDPFibonacci(int n, int[] array) { //利用一个数组保存已经计算出的结果,防止下次重复计算。 if(n == 1 || n == 2) return 1; if(array[n] == 0) array[n] = recursionDPFibonacci(n-1, array) + recursionDPFibonacci(n-2, array); return array[n]; }
下面给出测试代码:
public static void main(String[] args) { int[] array = new int[44]; //433494437 System.out.println(Main.recursionDPFibonacci(43, array)); }
关于斐波那契数列,有一个爬楼梯的问题,一层楼一共n个台阶,已知一次只能上一个台阶或者上两个台阶,问一共有多少种方式能爬到楼顶?
分析:通过找规律,发现:
n = 1, 1种;
n = 2, 2种;
n = 3, 3种;
n = 4, 5种;
n = 5, 8种;
即f(n) = f(n-1) + f(n-2).
代码如下:
public int climbStairs(int n) { if(n <= 2) return n; int a = 1, b = 2; for(int i = 2; i < n; i++) { int tmp = a + b; a = b; b = tmp; } return b; }
标签:
原文地址:http://www.cnblogs.com/lasclocker/p/4889475.html