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

    【相关题目】

  • 相关阅读:
    [AX]AX2012开发新特性outer join中使用QueryFilter
    [AX]AX2012开发新特性表继承
    docker环境安装
    poj 3469
    poj 1187
    poj 1159
    poj 2135
    poj 1273
    poj 1458
    poj 1141
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4799748.html
Copyright © 2020-2023  润新知