华为面试题:1000阶台阶,如果每次只能走1步,2步或3步,问:有多少种走法?(理解递归算法)

23 篇文章 4 订阅

作者:非妃是公主
专栏:《笔记》《C++》
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩

在这里插入图片描述

转载请标明原文链接:https://blog.csdn.net/myf_666/article/details/114113541
前几天和家人聊天,无意间听到了这道题,据说是花厂的面试题,不知真假,不过今天倒是用C++实现了一下;

乍一看,一千阶台阶可能有些懵,但是,不要慌计算机就是重复简单动作的一个工具。

如果我现在将它改为1阶,还未上幼儿园的小朋友可能会毫不犹豫地说有1种走法;

如果我将它改为2阶,可能稍微上过几天幼儿园的同学就会说,有两种走法,我们可以一下走两阶,或者分两次走,每次走一阶;

如果我将它改为3阶,那么一年级的小学生可能需要稍加列举一下才能分析出到底有多少种走法,请看下面的代码片:

1 1 1
1 2
2 1
3

细心的你会发现,只有4种是嘛?

是的,没错,正是四种;

那么,我们继续,如果我将题目改为4阶台阶呢?我们还需要一一例举吗?

NO,那样的话我们就需要到一年级去回炉重造了;

4阶,相当于我们一次走一步的走法(1)种数(乘上)走3阶的走法种数,走两步的走法(1)种数(乘上)走2阶走法种数,走三步的走法(1)种数(乘上)走1阶的走法种数;(这里走两步不能包含走一步的走法,走三步的走法不能包含走两步的走法。

现在我们的问题就清楚了,我们采用了递归的方法,不断地调用线程,来解决问题,这就是一个简单的所谓的算法;

算法,听起来很高深,其实就是将我们人类的多姿多彩的思维转化成为(抽象成)计算机可以执行的语言就好了,无非就是简单机械的判断和存储;当然这其中可能会用到一些数学的方法;

下面附上一个21行的简单的代码:

#include<iostream>
using namespace std;
int number(int n) {
	if (n == 1) {
		return 1;
	}
	else if (n == 2) {
		return 2;
	}
	else if (n == 3) {
		return 4;
	}
	else {
		return number(n - 1) + number(n - 2)  + number(n - 3);
	}
}
int main() {
	int n = 1000;
	cin >> n;//输入任意的台阶数,当然要考虑到个人计算机的算力,好比1000,一般的轻薄本或商务本的算力肯定是需要很久时间的,可以睡前开始,早晨起来后看结果,嘿嘿
	cout << endl << number(n);
}

但这里,要注意的是,不要计算重复,举个例子:

// An highlighted block
1 1 1 1

就是上面这种情况,第一步走了一步,但是,已经在return(n-1)中计算过了,就不要在return(n-2)中计算进去了。
四阶时
即return(n-1)

1 1 1 1
1 2 1
1 1 2
1 3

return(n-2)

2 1 1
2 2//在这里就不要包含1 1 1 1这种情况了,即用1 1的走法走前两阶,已经算在return(n-1)里面了

return(n-3)

3 1

所以共7种。。。在这里感谢“qq_34477404”老哥指正,谢谢!
所以,下面这三行代码是错误的:

else {
		return number(n - 1) + number(n - 2) * 2 + number(n - 3) * 4;
	}

正确的应为:

else {
		return number(n - 1) + number(n - 2) + number(n - 3);
	}

如果您觉得有用,可以留下个赞哦!

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
专业面试我的技巧和经验: 一、 巧妇难为无米之炊,事前做一些功课是必须的,把自己学习过的和应聘岗位相关的内容复习下,比如性能与算法岗位:本科电子信息工程和通信工程这些课程肯定学过,通信原理,信息论和编码,信号与系统,数字信号处理,复习一下掌握大概的轮廓一个星期应该差不多可以搞定. 二、 善于引导面试官,比如当面试到什么题不懂的时候,避免连几个都不懂,可以尝试这么说:我***方面的知识比较匮乏,不是很了解,但是我对***的知识还是比较熟习,我觉得***的知识在我们华为性能与算法工程师必须要掌握的吧。以我面试为例,面试我3G和4G的关键技术,已经这些关键技术的基本原理,我是做雷达信号处理的,确实不懂。我就和面试官说:对不起,因为研究生期间主要做的雷达信号处理的工作,我对移动通信的知识了解甚少,但是我对移动通信的基础只是比如通信原理和调制解调技术还有一定的了解(当然这都是我事先复习好的),我觉得无论什么类型的通信技术都离不开这些基本的理论。接着面试官就让我说信源编码和信道编码的作用已经他们通常采用的方,当然我也就能对答如流了。所以,引导很重要。 三、 专业面试对自己简历上不要为了蒙骗面试官,写的项目自己捡不熟悉,对简历上的东西一三不知,语言表达不清楚,说不半天不能告诉面试官你做的工作内容和意义,这个很不好。 群面 一般10-14个人,看当天应聘的人数而定,分2组,一个话题,让排序之类的,或者辩论之类的,不同的组会抽到不同的题,不同的地方也会有不同的题,在这里把题说出来没什么意义,这一轮会有很多意想不到的情况,比如这组我本来不是选为组长,但是在做总结的时候面试官让我做总结,或者突然你刚才某某同学说的话你同意吗,或者突然说你今天脸色好像不好看之类的,所以灵机应变才是王道。群面一般要自我介绍,自我介绍要简短,不要说太多,我建议按以下几个方面说,自己学校专业、来自哪里、然后说自己学习,主要稍微说下自己的项目,说下名字就OK了,然后说自己做项目获得成果,比如发表文章,专利和之类的。然后说自己优点和缺点,一般情况下优点缺点都要说,而且我觉得最好优点缺点自己多准备几个,免得到时候你要说的前面的人都说了,就像我们这组:我开始说缺点的时候说我性格比较急,做什么事情都想快点做完,午觉也不睡,但是经常适得其反,中午不谁觉,下午就工作效率低。后面好几个同学说的时候都这么说了,惹的面试官说,你们重复一个东西说。说缺点的时候大家要慎重,不要说和自己工作相关的缺点,比如我们那个组一个同学说:我的缺点就是比较随性,重要场合经常穿拖鞋为此挨了不少批评。 面试官:。。。。(前面省略了一些),你这随行的行为有同学提醒过你吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherries Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值