一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?

当时脑子不够用,10级楼梯嘛,每一次至少走一步,走完10步最多10次,那么用10个循环可以搞定,够傻逼的吧,看下面。

int method_num = 0;
int judge_num = 0;
bool judge(int total)
{
	judge_num++;
	if(total > 10)
		return false;
	else if(total == 10)
		++method_num;
	return true;
}

void zoulouti2()
{
	for(int i = 1; i <= 3; ++i) {
		int total = i;
		if(!judge(total))
			break;
		else {
			for(int j = 1; j <=3; ++j) {
				total += j;
				if(!judge(total))
					break;
				else {
					for(int k = 1; k <= 3; ++k) {
						total += k;
						if(!judge(total))
							break;
						else {
							for(int l = 1; l <= 3; ++l) {
								total += l;
								if(!judge(total))
									break;
								else {
									for(int m = 1; m <= 3; ++m) {
										total += m;
										if(!judge(total))
											break;
										else {
											for(int n = 1; n <= 3; ++n) {
												total += n;
												if(!judge(total))
													break;
												else {
													for(int o = 1; o <= 3; ++o) {
														total += o;
														if(!judge(total))
															break;
														else {
															for(int p = 1; p <= 3; ++p) {
																total += p;
																if(!judge(total))
																	break;
																else {
																	for(int q = 1; q <= 3; ++q) {
																		total += q;
																		if(!judge(total))
																			break;
																		else {
																			for(int r = 1; r <= 3; ++r) {
																				total += r;
																				if(!judge(total))
																					break;
																			}
																		}
																	}
																}
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}



这么长,这么粗,引以为戒呀,这代码写给谁看呢,程序员要学会偷懒,代码越精悍越优。

 

以10级楼梯为例,每次可以走1步、2步、3步,,那么前7步的走法再走3步或者,前8步的走法再走2步,前9步的走法最后走1步,这些步绝对就不会重复了,因为它们的最后一步是不同的。问题就转化为计算前7、8、9步的走法数了。于是有递推公式f(n) = f(n - 1) + f(n - 2) + f(n - 3)

为了加快计算的速度,把计算过的楼梯级使用vector缓存(最喜欢用vector了,但还没精通,失礼失礼)

#include <iostream>
#include <vector>
using namespace std;

static vector<int> louti;
int zoulouti1(int n)
{
	if(n <= louti.size()) // 已经计算过的楼梯级,直接返回vector里面的值即可
		return louti[n - 1];
	int i = louti.size();
	while(i < n) {
		// f(n) = f(n - 1) + f(n - 2) + f(n - 3)
		int zoufa = louti[i - 1] + louti[i - 2] + louti[i - 3];
		louti.push_back(zoufa);
		++i;
	}
	return louti.back();
}
void init_louti()
{
	// 只有1、2、3级楼梯,对应的走法
	louti.push_back(1);
	louti.push_back(2);
	louti.push_back(4);
}
int main()
{
	cout << "请输入楼梯级数:";
	int n = 0;
	cin >> n;
	init_louti();
	cout << n << "级楼梯的走法有:" << zoulouti1(n) << "种" << endl;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值