1. /**
    2. * 面试题10:斐波那契数列
    3. * 题目一:求斐波那契数列的第n项
    4. * 写一个函数,输入n,求斐波那契数列的第n项
    5. * Fibonacci数列定义如下:
    6. * f(n)={
    7. * 0 n=0
    8. * 1 n=1
    9. * f(n-1)+f(n-2) n>1
    10. * }
    11. */
    12. public class No10 {
    13. public static void main(String[] args) {
    14. //构建测试用例
    15. //(1)功能测试(正常输入)
    16. //(2)边界值测试(0,1,2等)
    17. //(3)性能测试(输入较大的数字)
    18. int[] test = {0,1,2,3,6,9,15};
    19. System.out.println("递归结果");
    20. for(int i:test){
    21. System.out.print(fibonacci1(i)+" ");
    22. }
    23. System.out.println();
    24. System.out.println("循环结果");
    25. for(int j:test){
    26. System.out.print(fibonacci2(j)+" ");
    27. }
    28. }
    29. //原始递归方法
    30. public static int fibonacci1(int n){
    31. if(n<=0){
    32. return 0;
    33. }
    34. if(n==1){
    35. return 1;
    36. }
    37. return fibonacci1(n-1)+fibonacci1(n-2);
    38. }
    39. //循环解决
    40. public static long fibonacci2(int n){
    41. if(n<=0){
    42. return 0;
    43. }
    44. if(n==1){
    45. return 1;
    46. }
    47. long pre0 = 0;
    48. long pre1 = 1;
    49. long result = 0;
    50. for (int i = 2; i <= n; i++) {
    51. result = pre0 + pre1;
    52. pre0 = pre1;
    53. pre1 = result;
    54. }
    55. return result;
    56. }
    57. //TODO:特殊数学公式解决
    58. }
    1. /**
    2. * 面试题10:斐波那契数列
    3. * 题目二:青蛙跳台阶问题
    4. * 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法
    5. * 拓展:青蛙也可以跳上n级台阶时,可证明公式为f(n)=2^(n-1)
    6. * 拓展:小矩形重叠大矩形,分析可知仍为斐波那契数列
    7. */
    8. public class No10etc {
    9. public static void main(String[] args) {
    10. //构建测试用例
    11. //功能测试(输入5,9等正常值)
    12. //边界值测试(输入0,1,2等)
    13. //性能测试(输入较大的数字)
    14. //异常值测试(输入负值等)
    15. int[] test = {5,9,0,1,2,23,-5};
    16. for(int element: test){
    17. System.out.print(element+"级台阶"+goUp1(element)+"---");
    18. }
    19. System.out.println();
    20. for (int element:test){
    21. System.out.print(element+"级台阶"+goUp2(element)+"---");
    22. }
    23. }
    24. //递归老办法解决
    25. public static int goUp1(int n){
    26. if(n<=0){
    27. return 0;
    28. }
    29. if(n==1||n==2){
    30. return n;
    31. }
    32. return goUp1(n-1)+goUp1(n-2);
    33. }
    34. //循环解决
    35. public static long goUp2(int n){
    36. if(n<=0){
    37. return 0;
    38. }
    39. if(n==1||n==2){
    40. return n;
    41. }
    42. long pre = 1;
    43. long post = 2;
    44. long result = 0;
    45. for(int i=3;i<=n;i++){
    46. result = pre + post;
    47. pre = post;
    48. post = result;
    49. }
    50. return result;
    51. }
    52. }