/**
* 面试题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;
}
}