/** * 面试题10:斐波那契数列 * 题目一:求斐波那契数列的第n项 * 写一个函数,输入n,求斐波那契数列的第n项 * Fibonacci数列定义如下: * f(n)={ * 0 n=0 * 1 n=1 * f(n-1)+f(n-2) n>1 * } */public class No10 { public static void main(String[] args) { //构建测试用例 //(1)功能测试(正常输入) //(2)边界值测试(0,1,2等) //(3)性能测试(输入较大的数字) int[] test = {0,1,2,3,6,9,15}; System.out.println("递归结果"); for(int i:test){ System.out.print(fibonacci1(i)+" "); } System.out.println(); System.out.println("循环结果"); for(int j:test){ System.out.print(fibonacci2(j)+" "); } } //原始递归方法 public static int fibonacci1(int n){ if(n<=0){ return 0; } if(n==1){ return 1; } return fibonacci1(n-1)+fibonacci1(n-2); } //循环解决 public static long fibonacci2(int n){ if(n<=0){ return 0; } if(n==1){ return 1; } long pre0 = 0; long pre1 = 1; long result = 0; for (int i = 2; i <= n; i++) { result = pre0 + pre1; pre0 = pre1; pre1 = result; } return result; } //TODO:特殊数学公式解决}
/** * 面试题10:斐波那契数列 * 题目二:青蛙跳台阶问题 * 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法 * 拓展:青蛙也可以跳上n级台阶时,可证明公式为f(n)=2^(n-1) * 拓展:小矩形重叠大矩形,分析可知仍为斐波那契数列 */public class No10etc { public static void main(String[] args) { //构建测试用例 //功能测试(输入5,9等正常值) //边界值测试(输入0,1,2等) //性能测试(输入较大的数字) //异常值测试(输入负值等) int[] test = {5,9,0,1,2,23,-5}; for(int element: test){ System.out.print(element+"级台阶"+goUp1(element)+"---"); } System.out.println(); for (int element:test){ System.out.print(element+"级台阶"+goUp2(element)+"---"); } } //递归老办法解决 public static int goUp1(int n){ if(n<=0){ return 0; } if(n==1||n==2){ return n; } return goUp1(n-1)+goUp1(n-2); } //循环解决 public static long goUp2(int n){ if(n<=0){ return 0; } if(n==1||n==2){ return n; } long pre = 1; long post = 2; long result = 0; for(int i=3;i<=n;i++){ result = pre + post; pre = post; post = result; } return result; }}