【面试题9】斐波那契数列
【题目描述】
写一个函数,输入n,求斐波那契数列的第n项。
【解决方案】
1. 递归,效率很低,挑剔的面试官不会喜欢。
因为递归的过程由于调用函数自身,函数调用是有时间和空间的消耗,每一次调用函数,都需要再内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都是需要时间的,每个进程的栈容量是有限的,很可能会引起调用栈溢出。
另外,递归中有可能很多计算都是重复的,从而对性能带来很大的负面影响。
2. 迭代(循环)。
我的代码实现1,仅供参考:
1 /// <summary> 2 /// 递归实现 3 /// </summary> 4 /// <param name="n"></param> 5 /// <returns></returns> 6 public static int Fibonacci(int n) 7 { 8 if (n <= 0) 9 { 10 return 0; 11 } 12 13 if (n == 1) 14 { 15 return 1; 16 } 17 18 return Fibonacci(n - 1) + Fibonacci(n - 2); 19 }
我的代码实现2,仅供参考:
1 /// <summary> 2 /// 迭代实现 3 /// </summary> 4 /// <param name="n"></param> 5 /// <returns></returns> 6 public static int Fibonacci(int n) 7 { 8 if (n <= 0) 9 { 10 return 0; 11 } 12 13 if (n <= 2) 14 { 15 return 1; 16 } 17 18 int first = 1; 19 int second = 1; 20 int result = 0; 21 22 for (int i = 0; i < n - 2; i++) 23 { 24 result = first + second; 25 first = second; 26 second = result; 27 } 28 29 return result; 30 }
【本题扩展】
1. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
斐波那契数列变种:把n级台阶看成f(n),它想调到n级台阶前的最后一跳可以通过一步,也可以通过两步,至于最后一跳之前的跳法种类可以分别通过f(n-1)和f(n-2)表示。
因此,n级台阶的不同跳法的总数为f(n)=f(n-1)+f(n-2)。
2. 在青蛙跳台阶的问题中,如果把条件改成:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶……它也可以跳上n级台阶,此时请问跳上n级台阶共有多少种跳法?
通过数学归纳法,我们可以得到f(n)=2^(n-1)。
【相关题目】