zoukankan      html  css  js  c++  java
  • 斐波那契数列——腾讯面试题台阶问题

    腾讯一道面试题:50个台阶,可以一次走一个台阶,也可以一次走两个台阶,那么走到50个台阶时,有多少种可能?

    分析:

    任何算法的背后,都隐藏着一个数学理论的支撑,所以大家都知道,数学是进阶算法的基石。

    这道题,我们先从最基本的分析,找规律,假设可能情况为an,不难发现,a1=1,a2=2,a3=3,a4=5,a5=8.....求解a50;显然不可能人工计算最后的结果,那么我们从c/c++程序员的思路来分析:

    这道题应该用什么方式来实现呢?必须要知道这些数的关系,逆向思维,递归思路是否能派上用场?要求a50,我们先求a49,要求a49,先求a48,以此类推到a1。貌似递归是个不错的选择,但是在这之前,还必须解决一个问题,就算是递归,也得知道这些数据的关联,怎么去递归调用,还是不能避开这个数学问题,我们需要找到一个通项公式,无论递归还是循环,必须建立在这个基础上。

    这里,我们最容易想到的就是找规律,用数学归纳法,证明可以先不用,通常是先用观察所得设计算法,完成算法设计之后,用多个实验数据证明归纳正确之后,再有必要,才去用数学方法证明。

    这里的规律还是显而易见的,不难发现,an=a(n-1)+a(n-2);通过上面的数据这个是容易得到的,当前数等于前两个数的和。这样的话,递归或者循环都可以解决了。但是,递归在大数据面前,是不建议使用的,这里千万别小看了a50,是个很大的数,递归不是一个好方法,所以,用循环实现如下:

     1 #include<stdint.h>
     2 #include<stdio.h>  
     3 int main()
     4 {
     5     uint64_t a[50];
     6     a[0] = 1;
     7     a[1] = 2;
     8     for (int i = 2; i < 50; i++)
     9     {
    10         a[i] = a[i - 1] + a[i - 2];
    11         printf("%lld
    ", a[i]);
    12     }
    13     
    14     return 0;
    15 }

    代码很简单。但这个数是真大哦。需要一个分析过程,用输出的结果的大概应证了我们的归纳正确。要想证明,请数学大佬们自己来。

     透过现象看本质:

    这个面试题,究其本源,到底考察的是什么?前面说到,所有算法一定有个数学理论支撑,所以,这个面试题,考察的就是著名的斐波那契数列。斐波那契数列

    万变不离其数学本源,所以,要想提高程序员的层次,算法是个必备的技能,而在次期间,数学也是需要我们掌握的必备技能,你可以不创造算法,不去推到算法实现的过程,但你一定要能把算法用代码实现,并找到其数学本源。

    路漫漫兮其修远,吾将上下而求索。

  • 相关阅读:
    html中的浮动
    Html中元素的分类
    前端标签命名规范
    meta详解
    CSS的嵌套方法
    html标签
    W3C标准
    AE待整理
    AE小知识点备忘录
    Maximum Subarray
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6548227.html
Copyright © 2011-2022 走看看