菲波纳切数列

写一个函数,输入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)。分析到这里,我们不难看出这实际上就是菲波纳切数列了。

原文地址:https://www.cnblogs.com/yingpu/p/9235598.html

时间: 2024-10-04 18:11:53

菲波纳切数列的相关文章

js实现菲波那切数列的两种常用方法

菲波那切数列即:1 1 2 3 5 8......,后面的数字是前面两个数字的和,并且第一个,第二个数字都是1,用js实现 的两种方法,一种通过常用的递归调用,第二种不通过递归,而是通过强大的闭包实现. 1.递归实现 // fab 1 1 2 3 5 8 function fab(num) { if(num==1 || num==2){ return 1; }else{ return fab(num-1)+fab(num-2); } } alert(fab(5)) 2.闭包实现.闭包主要在于:1

hduoj 1848 Fibonacci again and again【sg函数】【博弈】【菲波那切数列】

Fibonacci again and again Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1,2,3,5,8,13--就是菲波那契数列. 在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题. 今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下: 1.  这是

菲波那切数列

一个数组:1,1,2,3,5,8,13,21...+m: static void Main(string[] args) { Console.Write("输入想求的斐波那契数列项数:"); int n = Convert.ToInt32(Console.ReadLine()); //递归实现 Console.WriteLine("斐波那契数列数列递归算出的第{0}项为:{1}", n, Calculate(n)); } static int Calculate(i

BestCoder Round #71 (div.2) (hdu 5620 菲波那切数列变形)

KK's Steel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 350    Accepted Submission(s): 166 Problem Description Our lovely KK has a difficult mathematical problem:he has a N(1≤N≤1018) meters s

php实现菲波那切数列和杨辉三角

1.递归  显示斐波那契数列 <?PHP function recursion($num){ //判断是否小于0 if($num<0){ return -1; } if($num==1){ return 0; } if($num==2 || $num==3){ return 1; } return recursion($num-1)+recursion($num-2); } //循环显示 for($i=1;$i<=20;$i++) { $str .= ',',recursion($i);

hduoj 1865 1string 【大数】【菲波那切数列】

1sting Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5310    Accepted Submission(s): 2030 Problem Description You will be given a string which only contains ‘1’; You can merge two adjacent ‘1

带有记忆的菲波那切数列

public static int Fib(int n) { int q=0; int []r=new int[n+1]; r[0]=1; r[1]=1; for(int j=2;j<=n;j++) { r[j]=r[j-1]+r[j-2]; } return r[n]; }

菲波纳契数列

#include "stdio.h" void main() { int a[20],i; a[0]=1; a[1]=1; for(i=2;i<20;i++) a[i]=a[i-1]+a[i-2]; for(i=0;i<20;i++) printf("%d ",a[i]); }

leetcode70 C++ 4ms 爬楼梯 菲波那切数列

class Solution { public: int climbStairs(int n) { int a = 1; int b = 1; int temp; while(n>0){ n--; temp = a; a = b; b += temp; } return a; } }; 原文地址:https://www.cnblogs.com/theodoric008/p/9413343.html