【面试题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)。

【相关题目】

原文地址:https://www.cnblogs.com/HuoAA/p/4799748.html