MOOC清华《程序设计基础》第6章第1题:n级台阶问题(递推法)
2017-07-23 18:47
417 查看
题目描述
下n级台阶,每步可下1级或2级台阶。那么从n级台阶下到地面,共有多少种不同的下台阶方案?
输入:n
输出:方案数
输入格式
多行输入,每一行输入一个正整数n,表示n级台阶
输出格式
每一行输出n级台阶的方案数
样例输入
样例输出
DevCpp可以编译通过,而学堂在线OJ系统不通过的代码:
错误提示如下:
经查,这是因为OJ编译器版本比较老旧造成的,定义数组大小时必须使用常量,不能用变量。
测试结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/7553b64a61aa2f2a09b1dc4ad622b01b)
令我惊奇地发现:这个问题背后的数学规律,居然也是斐波那契数列!要是把题目改成或一次走1级、或一次走2级、或一次走3级,那就不能用斐波那契数列来递推了。
把定义数组长度时的变量N改为常量20以后,代码就能顺利通过OJ测试了!代码如下:
#include <iostream>
using namespace std;
int main()
{
int n[20] = {0};
int i = 0;
while(cin>>n[i]) //输入台阶数
i++;
int scheme_1 = 1, scheme_2 = 2; //给最简单的两种方案赋初值
int scheme[20] = {0};
int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用数组递推,节约内存空间
for(int j = 0; j < i; j++)
{
qian_xiang = scheme_1;
shang_xiang = scheme_2;
if(n[j] >= 3)
{
for(int k = 3; k <= n[j]; k++)
{
ben_xiang = shang_xiang + qian_xiang;
qian_xiang = shang_xiang;
shang_xiang = ben_xiang; //递推公式,这个规律在草稿纸上推得
}
scheme[j] = ben_xiang;
}
if(n[j] == 1) scheme[j] = scheme_1;
if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意循环变量和数组下标
}
for(int j = 0; j < i; j++)
cout << scheme[j] << endl;
return 0;
}
下n级台阶,每步可下1级或2级台阶。那么从n级台阶下到地面,共有多少种不同的下台阶方案?
输入:n
输出:方案数
输入格式
多行输入,每一行输入一个正整数n,表示n级台阶
输出格式
每一行输出n级台阶的方案数
样例输入
1 2
样例输出
1 2
DevCpp可以编译通过,而学堂在线OJ系统不通过的代码:
#include <iostream> using namespace std; int N = 10; //台阶数,方便可调 int main() { int n = {0}; int i = 0; while(cin>>n[i]) //输入台阶数 i++; int scheme_1 = 1, scheme_2 = 2; //给最简单的两种方案赋初值 int scheme = {0}; int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用数组递推,节约内存空间 for(int j = 0; j < i; j++) { qian_xiang = scheme_1; shang_xiang = scheme_2; if(n[j] >= 3) { for(int k = 3; k <= n[j]; k++) { ben_xiang = shang_xiang + qian_xiang; qian_xiang = shang_xiang; shang_xiang = ben_xiang; //递推公式,这个规律在草稿纸上推得 } scheme[j] = ben_xiang; } if(n[j] == 1) scheme[j] = scheme_1; if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意循环变量和数组下标 } for(int j = 0; j < i; j++) cout << scheme[j] << endl; return 0; }
错误提示如下:
Main.cpp: In function 'int main()': Main.cpp:9:15: error: variable-sized object 'n' may not be initialized int n = {0}; ^ Main.cpp:14:20: error: variable-sized object 'scheme' may not be initialized int scheme = {0}; ^
经查,这是因为OJ编译器版本比较老旧造成的,定义数组大小时必须使用常量,不能用变量。
测试结果:
令我惊奇地发现:这个问题背后的数学规律,居然也是斐波那契数列!要是把题目改成或一次走1级、或一次走2级、或一次走3级,那就不能用斐波那契数列来递推了。
把定义数组长度时的变量N改为常量20以后,代码就能顺利通过OJ测试了!代码如下:
#include <iostream>
using namespace std;
int main()
{
int n[20] = {0};
int i = 0;
while(cin>>n[i]) //输入台阶数
i++;
int scheme_1 = 1, scheme_2 = 2; //给最简单的两种方案赋初值
int scheme[20] = {0};
int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用数组递推,节约内存空间
for(int j = 0; j < i; j++)
{
qian_xiang = scheme_1;
shang_xiang = scheme_2;
if(n[j] >= 3)
{
for(int k = 3; k <= n[j]; k++)
{
ben_xiang = shang_xiang + qian_xiang;
qian_xiang = shang_xiang;
shang_xiang = ben_xiang; //递推公式,这个规律在草稿纸上推得
}
scheme[j] = ben_xiang;
}
if(n[j] == 1) scheme[j] = scheme_1;
if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意循环变量和数组下标
}
for(int j = 0; j < i; j++)
cout << scheme[j] << endl;
return 0;
}
相关文章推荐
- MOOC清华《程序设计基础》第6章:橱窗插花问题(递推法)
- MOOC清华《程序设计基础》第5章:分书问题-代码二
- MOOC清华《程序设计基础》第5章:八皇后问题-代码二
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- MOOC清华《程序设计基础》第6章第2题:求f(a,b)问题(动态规划)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- MOOC清华《程序设计基础》期末考试第6题:鸡兔同笼问题
- MOOC清华《程序设计基础》第1章第5题:银行存款问题
- MOOC清华《程序设计基础》第2章第5题:银行存款问题2
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法一)
- MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)
- MOOC清华《程序设计基础》第6章:三种递推方法求兔子数列问题(斐波那契数列)
- MOOC清华《程序设计基础》第5章:N皇后问题(带矩阵输出)
- MOOC清华《程序设计基础》第5章:求n的阶乘(用递推法做)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第6章:橱窗插花问题(枚举法)
- MOOC清华《程序设计基础》第5章:分书问题-代码一
- MOOC清华《程序设计基础》第6章:分鱼问题(从A到E递推)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法二)