1、题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
2、思路
运用递归,前面第一项的值加上前面第二项的值就得到当前项的值,效率很低,因为将程序抽象为一棵树后,从上往下计算,其中有许多节点是需要重复计算的。代码如下:
public class Solution {
/*
利用递归的方法,效率很低,因为将程序抽象为一棵树后,其中有许多节点是需要重复计算的
*/
public int Fibonacci(int n) {
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
注:下面完全自己写的代码
public
class
Solution {
public
int
Fibonacci(
int
n) {
if
(n <=
0
){
return
0
;
}
if
(n <=
2
){
return
1
;
}
return
Fibonacci(n-
1
) + Fibonacci(n-
2
);
}
}
|
3、对递归的代码进行改进,从下往上计算,代码如下。
public class Solution {
/*
利用递归的方法,效率很低,因为将程序抽象为一棵树后,从上往下计算,其中有许多节点是需要重复计算的,对递归
的代码进行改进,从下往上计算
*/
public int Fibonacci(int n) {
int result[] = {0,1};
if(n < 2){//如果n是0或1,就直接返回n
return result[n];
}
int fibNMinusOne = 1;//要计算项前面第一项的值
int fibNMinusTwo = 0;//要计算项前面第二项的值
int fibN = 0;
for(int i=2;i<=n;i++){
fibN = fibNMinusOne + fibNMinusTwo;//前面第一项的值加上前面第二项的值就得到当前项的值
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;//返回当前项的值
}
}
注:下面完全自己写的代码
public class Solution {
public int Fibonacci(int n) {
if(n <= 0){
return 0;
}
if(n == 1 || n==2){
return 1;
}
int first = 1;
int second = 1;
int count = 3;
int sum = 0;
while(count<=n){
sum = first + second;
count++;
first=second;
second = sum;
}
return sum;
}
}
4、斐波那契数列的应用
(1)青蛙跳台阶 问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution {
public int JumpFloor(int target) {
if(target <= 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2 ){
return 2;
}
int first = 1;
int second = 2;
int sum = 0;
for(int i=3;i<=target;i++){
sum = first + second;
first = second;
second = sum;
}
return sum;
}
}
(2)青蛙变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution {
public int JumpFloorII(int target) {
if(target == 1){
return 1;
}
return 2 * JumpFloorII(target - 1);
}
}