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

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 华为面试题:1000阶台阶,如果每次只能走1步,2步或3步,问:有多少种走法?(理解递归算法),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

作者:非妃是公主
专栏:《笔记》《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);
	}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130610.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!