腾讯一道面试题: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\n", a[i]);
12 }
13
14 return 0;
15 }
代码很简单。但这个数是真大哦。需要一个分析过程,用输出的结果的大概应证了我们的归纳正确。要想证明,请数学大佬们自己来。
透过现象看本质:
这个面试题,究其本源,到底考察的是什么?前面说到,所有算法一定有个数学理论支撑,所以,这个面试题,考察的就是著名的斐波那契数列。斐波那契数列
万变不离其数学本源,所以,要想提高程序员的层次,算法是个必备的技能,而在次期间,数学也是需要我们掌握的必备技能,你可以不创造算法,不去推到算法实现的过程,但你一定要能把算法用代码实现,并找到其数学本源。
路漫漫兮其修远,吾将上下而求索。