题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
方法1:递归
public class Solution { public int Fibonacci(int n) { if (n == 0){ return 0; } else if(n == 1){ return 1; } else{ return Fibonacci(n - 1) + Fibonacci(n - 2); } } }
方法2:循环
public class Solution { public int Fibonacci(int n) { if(n == 0){ return 0; }else if(n == 1){ return 1; }else{ int a = 0; int b = 1; int f = 0; for(int i=1;i<n;i++){ f = a + b; a = b; b = f; } return f; } } }
递归是函数调用函数自身,循环是通过初始值和终止条件在一个范围内重复计算
基于递归实现的函数代码简单,但性能不如基于循环的方法,如果没有别的要求优先使用递归
递归的缺点是函数的调用有时间和空间的消耗,并且递归中有许多重复的计算
类似题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution { public int JumpFloor(int target) { if(target == 0){ return 0; }else if(target == 1){ return 1; }else if(target == 2){ return 2; }else{ //递归 //return JumpFloor(target-1)+JumpFloor(target-2); //循环 int a = 1; int b = 2; int J = 0; for(int i=2;i<target;i++){ J = a + b; a = b; b = J; } return J; } } }
类似题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法(数学归纳法2的n-1次方)。
public class Solution { public int JumpFloorII(int target) { return (int)Math.pow(2,(target-1)); } }