zoukankan      html  css  js  c++  java
  • P73、面试题9:斐波那契数列

    题目一:写一个函数,输入n,求斐波那契数列(Fibonacci)数列的第n项,斐波那契数列的定义如下: f(n) = {0  n = 0;  1   n = 1;  f(n-1)+f(n-2)  n>1}

    题目二:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    即求斐波那契数列的f(n)的结果。

    在青蛙跳台阶的问题中,如果把条件改成:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。。。。。它也可以跳上n级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?我们用数学归纳可以证明f(n)=2的n-1次方。

    解法一fibonacci_1(效率低下),解法二fibonacci_2(时间复杂度为n)

    package com.yyq;
    
    /**
     * Created by Administrator on 2015/9/10.
     */
    public class Fibonacci {
        public static long fibonacci_1(int n){
            if(n <= 0) return 0;
            if(n == 1) return 1;
            return fibonacci_1(n - 1) + fibonacci_1( n - 2);
    
        }
    
        public static long fibonacci_2(int n){
            if(n <= 0) return 0;
            int result[] = {0,1};
            long fibOne = result[0];
            long fibTwo = result[1];
            long temp = 0;
            if(n <2){
                return result[n];
            }
            for(int i = 2; i <= n; i++) {
                temp = fibOne + fibTwo;
                fibOne = fibTwo;
                fibTwo = temp;
            }
            return temp;
        }
    
        // ====================测试代码====================
        public static void Test(int n, int expected)
        {
            if(fibonacci_1(n) == expected)
                System.out.println("Test for "+n+" in solution1 passed.");
            else
                System.out.println("Test for " + n + " in solution1 fail.");
    
            if(fibonacci_2(n) == expected)
                System.out.println("Test for " + n + " in solution2 passed.");
            else
                System.out.println("Test for " + n + " in solution2 fail.");
        }
    
        public static void main(String[] args){
            Test(0, 0);
            Test(1, 1);
            Test(2, 1);
            Test(3, 2);
            Test(4, 3);
            Test(5, 5);
            Test(6, 8);
            Test(7, 13);
            Test(8, 21);
            Test(9, 34);
            Test(10, 55);
            Test(40, 102334155);
        }
    },
     
    输出结果:
    Test for 0 in solution1 passed.
    Test for 0 in solution2 passed.
    Test for 1 in solution1 passed.
    Test for 1 in solution2 passed.
    Test for 2 in solution1 passed.
    Test for 2 in solution2 passed.
    Test for 3 in solution1 passed.
    Test for 3 in solution2 passed.
    Test for 4 in solution1 passed.
    Test for 4 in solution2 passed.
    Test for 5 in solution1 passed.
    Test for 5 in solution2 passed.
    Test for 6 in solution1 passed.
    Test for 6 in solution2 passed.
    Test for 7 in solution1 passed.
    Test for 7 in solution2 passed.
    Test for 8 in solution1 passed.
    Test for 8 in solution2 passed.
    Test for 9 in solution1 passed.
    Test for 9 in solution2 passed.
    Test for 10 in solution1 passed.
    Test for 10 in solution2 passed.
    Test for 40 in solution1 passed.
    Test for 40 in solution2 passed.
  • 相关阅读:
    使用Dubbox构架分布式服务
    Elasticsearch搜索之explain评分分析
    Elasticsearch搜索之most_fields分析
    Elasticsearch搜索之cross_fields分析
    Elasticsearch搜索之best_fields分析
    Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)
    ibatis2.3中#和$符号的区别(转)
    读文章有感
    图片bmp格式转换为jpg格式
    IndexOf、LastIndexOf、Substring的用法
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4918305.html
Copyright © 2011-2022 走看看