斐波那契数列——腾讯面试题台阶问题

腾讯一道面试题: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 }

 

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

 透过现象看本质:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值