zoukankan      html  css  js  c++  java
  • 菲波纳切数列

    写一个函数,输入n,求斐波那契数列(Fibonacci)数列的第n项。斐波那契数列定义如下:

    当n=0时,f(n)=0;当n=1时,f(n)=1;当n>1时,f(n)=f(n-1)+f(n-2)。

    效率很低的解乏,挑剔的面试官不会喜欢。

    public int fibo(int n){
        if(n<=0) return 0;
        if(n==1) return 1;
        
        return fibo(n-1)+fibo(n-2);
    }

    我们以求解f(10)为例来分析递归的求解过程。想求得f(10),需要先求的f(9)和f(8)。同样,想求得f(9),需要先求得f(8)和f(7)。我们不难发现在这棵树中有很多节点是重复的,而且重复的节点数会随着n的增大而急剧增加,这意味着计算量会随着n的增大而急剧增大。

    面试官期待的实用解法:

    首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)...依次类推就可以算出第n项了。算法时间复杂度为O(n)。

    public class fibo{
        public int getFibo(int n){
            int[] result = {0,1};
            if(n<2){
                return result[n];
            }
            int fibOne = 0;
            int fibTwo = 1;
            int fibN=0;
            for(int i=2;i<=n;i++){
                fibN = fibOne + fibTwo;
                fibOne = fibTwo;
                fibTwo = fibN;
            }
            return fibN;
        }
        public static void main(String[] args){
            fibo f = new fibo();
            int result = f.getFibo(3);
            System.out.println(result);
        }
    }

     题目二:

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

    首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法,如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。

    接着我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳一级,此时跳法数目等于后买呢剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。分析到这里,我们不难看出这实际上就是菲波纳切数列了。

  • 相关阅读:
    [luoguP3953] 逛公园(DP + spfa)
    [luoguP3960] 列队(动态开点线段树)
    [luoguP2325] [SCOI2005]王室联邦(树分块乱搞)
    [luoguP1053] 篝火晚会(贪心 + 乱搞)
    Linux_C socket 一些知识
    Linux_C socket 服务器(cat ,execl功能)
    Linux_C socket server.c clinet.c功能分开写
    Linux_C socket clinet.c
    Linux_C AF_INET和PF_INET的细微不同
    Linux_socket一些基本函数和结构体
  • 原文地址:https://www.cnblogs.com/yingpu/p/9235598.html
Copyright © 2011-2022 走看看