题目:斐波那契数列
考点:递归和循环
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39。
法一:递归法,不过递归比较慢,会超时,所以不考虑
举个小点的例子,n=4,看看程序怎么跑的:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1)
+ Fibonacci(1) + Fibonacci(0);
由于我们的代码并没有记录Fibonacci(1)和Fibonacci(0)的结果,对于程序来说它每次递归都是未知的,因此光是n=4时f(1)就重复计算了3次之多。
1 public class Solution { 2 public int Fibonacci(int n) { 3 if(n <= 1){ 4 return n; 5 }else{ 6 return Fibonacci(n-1)+Fibonacci(n-2); 7 } 8 } 9 }
递归法运行时间:1200ms
法二:利用循环
1 public class Solution { 2 //求斐波那契数列的前n项和 3 public int Fibonacci(int n) { 4 if(n == 0){ 5 return 0; 6 } 7 if(n == 1 || n == 2){ 8 return 1; 9 } 10 int one = 1; 11 int two = 1; 12 int sum = 0; 13 for(int i = 2; i < n; i++){ 14 sum = one + two; 15 one = two; 16 two = sum; 17 } 18 return sum; 19 } 20 }
循环法运行时间:21ms
法三:动态规划法
1 public class Solution { 2 //求斐波那契数列的前n项和 3 public int Fibonacci(int n) { 4 //动态规划法 5 if(n == 0) return 0; 6 int one = 1; 7 int two = 1; 8 while(n-- > 2){ 9 two = two + one; 10 one = two - one; 11 } 12 return two; 13 } 14 }
动态规划法运行时间:13ms