求斐波那契数列的第n项
递归:
递归法实现起来简单,但是因为会计算重复的节点,这就意味着计算量会随着n的增大急剧增大。当计算n=50,第50项的时候已经相当耗时
非递归:
可以采用循环,先得到f(0) f(1) 相加得到f(2) 再相加得到f(3) 再得到f(4) 依次得到f(n)
//写一个函数,输入n,求斐波那契数列的第n项
public class Fibonaccisequence {
/**
*递归处理
*/
public static long printFibonaccisequence(int n){
if(n==0){
return 0;
}else if(n==1){
return 1;
}else{
return printFibonaccisequence(n-1)+printFibonaccisequence(n-2);
}
}
//非递归处理
public static long getFibonaccisequence(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
long firstMinus = 0;
long secondMinus = 1;
long N = 0;
for(int i=2;i<=n;i++){
N = firstMinus + secondMinus;
firstMinus = secondMinus;
secondMinus = N;
}
return N;
}
public static void main(String[] args) {
long i = Fibonaccisequence.getFibonaccisequence(2);
long i2 = Fibonaccisequence.printFibonaccisequence(5);
System.out.println(i);
if(i==i2){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
变形:青蛙跳台阶
同样也是斐波那契数列的应用 注意前3项与斐波那契数列的不同 但也是菲波那切数列的应用
/**
* 一只青蛙 一次可以跳上一个台阶,也可以跳上两个台阶,求该青蛙跳上n阶台阶一共有多少种跳法
*/
public class FrogUpStairs {
//递归
public static long frogUpStairsByRecursive(long n){
if(n==0){
return 0;
}else if(n==1){
return 1;
}else if(n==2){
return 2;
}else{
return frogUpStairsByRecursive(n-1)+frogUpStairsByRecursive(n-2);
}
}
//非递归
public static long FrogUpStairs(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
long firstMaxium = 1;
long secondMaxium = 2;
long N = 0;
for (int i=3;i<=n;i++){
N = firstMaxium + secondMaxium ;
firstMaxium = secondMaxium;
secondMaxium =N;
}
return N;
}
public static void main(String[] args) {
//long i = FrogUpStairs.frogUpStairsByRecursive(30);
long i1 = FrogUpStairs.FrogUpStairs(100);
System.out.println(i1);
//System.out.println(i);
}
}