复盘PHP经典问题解决过程:上台阶问题

题目

有个人想上一个50级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?例如:总共3级台阶,可以先迈1级再迈2级,或者先迈2级再迈1级,或者迈3次1级总共3中方式。

心路历程

这个题目我刚看到的时候觉得很有意思,值得思考一下,也和同学讨论过思路,并没有直接去网上找答案,觉得那样的话就浪费了,所以自己先尝试着解了。

说这么多是希望大家也不要直接去看解答,因为看完之后一个星期也就忘了。可以先收藏一手,自己去试试然后再回来看,我会把我自己解的思路和正解都放在这篇文章里。

思路step1:

从初中生的思路来看,第一个能想到的方法肯定是一个二元方程,也就是x+2y=50,其中x代表迈1步,y代表迈2步,无论怎么迈总共50级台阶。

接下来的问题就是求这个方程解的数量(不是某一个解),x+2y-50=0这个方程的所有解应该是一条直线,所以我很单纯的去把图给画了,就像下面这个样子:

PHP经典面试题:上台阶问题

再考虑x和y都必须是整数才能符合题意,y取值在025之间,可以看出只要y是整数解那么x一定为整数解,0也可以作为一种特殊情况,综上y可能的取值是:025共26个。那么相对应的x取值也就可以算出来了。

这里还有一种情况,如果总台阶数不是50,那么y的取值范围有可能是0~24.5,那么我认为y只能取值到24,也就是向下取整。

思路step2:

如果仅从数量上来看,xy总共有26种组合的方式,但这肯定不是最后答案,例如,迈2次1步再迈24次2步和先迈24次2步再迈2次1步是两种不同的方式,那么接下来就是排列组合的问题。

所以,我们要求的是所有xy同为整数的解的排列之和,是不是感觉有点复杂了,但是没关系,前面说的内容都是用PHP可以实现的,排列组合也是可以用PHP实现的。然后,排列组合算法的第一个问题就是如何实现阶乘?

在PHP中range函数可以建立一个包含指定范围单元的数组,允许传入三个参数起始值、终止值和步长值,例如rang(1,3)会返回包含1、2、3这三个数的一个数组。

另外PHP中的array_product函数可以计算数组中所有值的乘积

有了这两个函数我们就可以自己写出阶乘的函数了,虽然我不知道效率怎么样,但起码我们不用往递归的方面去想了,另外还需要考虑一下0和1阶乘的情况,就是下面这个样子:

PHP经典面试题:上台阶问题

有了阶乘,排列也就有了:

PHP经典面试题:上台阶问题

回到问题上来,我们需要用到组合吗?

首先,总数量是确定的x+y,而且第一次迈2步和后面无论第几次迈2步都是相同的,所以这种排列组合其实可以转化为“把鸡蛋放入篮子”的问题——将n个无差别的鸡蛋放入m个篮子中共有几种放法。那么求组合数函数也是需要的:

PHP经典面试题:上台阶问题

接下来就是循环每一个可能解,可以总是将x值作为鸡蛋的数量,将xy之和作为篮子的数量,也就是C(x+y,x),举个例子来说就是,总共要迈26次脚,选择其中2次只迈1步,有多少种迈法。

思路step3:

有了前面那么多的思考,我们来写代码:

PHP经典面试题:上台阶问题

经过测试,最终50级台阶的走法有20365011074种,二百零三亿六千五百零一万一千零七十四种(醉了)。

那么到这里我就开始去网络上找正确答案了,让我震惊了,发现我的思路果然是初中生的,且是从来不参加任何数学竞赛的那种,下面我分析一下网络上答案的思路。

答tu案cao

网上的解只有一种,那就是把这个问题归结为斐波那契数列的问题,完全看不出来好吗!

答案穷举了总台阶数从1级到5级的情况,得出结论1级共1种走法,2级2种走法,3级3中走法,4级5种走法,5级有八种走法,然后就开始研究斐波那契数列去了!

那你出个题目出个那么悬乎干嘛!直接让我们用PHP写个斐波那契函数不就好了吗!要考察思维能力也得给点提示啊!比如说设置两个问题:第一问,当台阶总数为5时有几种走法?第二问,当台阶总数为n时有几种走法?

总之呢就是在面试的时候,如果你见过这题那么恭喜你,如果没见过那么就可以去下一题了。

当然也有大神给出了比较让人信服的逻辑:

当我们走到第50层的时候,最后有两种选择,从49开始迈1级或者从48开始迈2级。那么到达50层的走法等于到达49层的走法+到达48层的走法,以此类推,可以得到总的走法符合斐波那契数列,我们的代码就好写了。

恩............膜拜奥数大神的思维。

PHP写斐波那契应该是比较简单的问题,那最后让我们用答案中的斐波那契函数来验证一下自己的答案。

PHP经典面试题:上台阶问题

可以看到,小编自己的思路和最终答案是相同的,只是过程相对复qing杂xi。

还是不太放心,测试了台阶总数从1~7的所有情况,也都是符合答案的,甚至我没有特殊考虑的只有1~2层的情况也能返回正确的答案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 跨冬跃秋新年又不远了,淘宝又到狂欢节了,05年的经济整体出现了下滑,淘宝中小卖家在搜索流量大不如以前,不管你怎么优...
    橘子老师_4a41阅读 275评论 1 2
  • 今天的早餐比较西化,晚上烤的蛋糕,腌制好的梅花肉(梅花肉很嫩),早上起来只需要煎肉和火腿,热一下牛奶就行了,这样的...
    小蓝菊阅读 133评论 0 1
  • 一、徐寿老师告诉我们经文是无量无边的意思,凡解释是从一个角度看出一个意思,从不同的角度就能看出不同的意思。...
    童珠兰阅读 541评论 0 2