题目1:写一个函数,输入n,求Fibonacci数列的第n项。该数列定义如下:
n=0时,f(n)=0;
n=1时,f(n)=1;
n>1时,f(n)=f(n-1)+f(n-2)
1、 效率差的递归算法:时间复杂度以n的指数的方式递增。因为求f(10)=f(9)+f(8);f(9)=f(8)+f(7);f(8)=f(7)+f(6);可以看出有很多项是重复计算的。
//斐波那契数列,递归。通过测试 //f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) public class Fibonacci{ public static void main(String[] args){ System.out.println(fibonacci(8)); } public static int fibonacci(int n){ if(n<=0){//此处避免无法处理n<0的情况!!! return 0; } if(n==1){ return 1; } return fibonacci(n-1)+fibonacci(n-2); } }
2、进一步改进,非递归算法(时间复杂度O(n))
//斐波那契数列,非递归。通过测试 //f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) public class Fibonacci{ public static void main(String[] args){ System.out.println(fibonacci(2)); } public static int fibonacci(int n){ if(n<=0){//此处避免无法处理n<0的情况!!! return 0; } if(n==1){ return 1; } int minusOne = 1; int minusTwo = 0; int fibN = 0; for(int i = 2; i<=n; i++){ fibN = minusOne + minusTwo; minusTwo = minusOne; minusOne = fibN; } return fibN; } }
题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶共多少种跳法。答案:斐波那契数列f(n)=f(n-1)+f(n-2)
题目3:一只青蛙一次可以跳上1级台阶,也可以跳上2级……也可以跳上n级。求该青蛙跳上一个n级的台阶共多少种跳法。答案:数学归纳法可得f(n)=2n-1
题目4:可以用2*1(单位:cm)的小矩形横着或者竖着去覆盖更大的矩形。请问8个2*1的小矩形无重叠覆盖一个2*8的大矩形,共有多少中方法?
答案:f(8)=f(7)+f(6),依然是斐波那契数列问题。