JAVA实现斐波那契数列问题(《剑指offer》)

来源:互联网 发布:c语言常用算法 编辑:程序博客网 时间:2024/06/18 08:23

题目描述:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

题目一:写出一个函数,输入n,求斐波那契数列的第n项。

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

第二个题目,其实就是第一个题目的意思。若将 n 级台阶时的跳法看成是 n 的函数,记为 f(n)。

青蛙在第一级台阶时,有两种跳法:

第一次跳 1 级,那么,还剩 n-1 级台阶,那么其跳法总数为 f(n-1)

第一次跳 2 级,那么,还剩 n-2 级台阶,那么其跳法总数为 f(n-2)

因此:f(n) = f(n-1)+ f(n-2)

很明显,这也是一个斐波那契数列。

一般解法:低效却是最容易想到的:递归算法

[cpp] view plain copy
  1. /** 低效率解法,例 n=100,计算时间超长。有大量重复计算*/  
  2. int Feibo1(int n)  
  3. {  
  4.     if(n < 0)  
  5.         return -1;  
  6.   
  7.     if(n < 2)  
  8.         return (0 == n)? 0 : 1;  
  9.     else  
  10.         return Feibo1(n - 1) + Feibo1(n - 2);  
  11. }  
如下图:可见有大量重复节点,即大量重复计算


传说中的斐波那契数列问题,经典中的经典:



做多了基于斐波那契数列问题的变形题目,现在要干撸斐波那契数列,突然有点不知所措了,往常结合题目语境的时候都能做出来,可是斐波那契数列到底是什么呢?让我们来复习一下:

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

记住这句话:

从第2项开始,每一项都等于前两项之和。(第0项是0,第一项是1)

解答:实用解法,不用递归而实用循环

  1. /**实用解法:O(n)*/  

[java] view plain copy
  1. public class Solution {  
  2.     public int Fibonacci(int n) {  
  3.         if(n==0)return 0;          
  4.         int n0=0,n1=1;  
  5.         int n2=n0+n1;  
  6.         for(int i=2;i<=n;i++){              
  7.             n2=n0+n1;  
  8.             n0=n1;  
  9.             n1=n2;  
  10.         }  
  11.         return n2;  
  12.     }  
  13. }  

牛客网截图:

0 0
原创粉丝点击