题目一描述
楼梯有n(0<n<30)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,编程计算共有多少种不同的走法。
输入输出格式
输入格式:
输入包括一组测试数据(数量不超过100),即为台阶数n。最后一个为0,表示输入结束。
输出格式:
输出对应的结果,即为走法的数目,以空格间隔。
输入输出样例
输入样例#1: 复制
1 2 3 4 0
输出样例#1: 复制
1 2 3 5
解题思路
此题为递归类问题,即为了到达n阶台阶,存在先到n-1阶以及n-2阶台阶两种方案,故到n阶台阶的走法为到n-1阶和n-2阶走法之和。如果递归直到n=1和n=2,此两种情况下:
台阶1:step=1(1)
台阶2:step=2(11,2)
由于题目给定的台阶数较小,可直接使用递归调用来实现,效率较低,但比较好理解。
代码
#include<bits/stdc++.h>
using namespace std;
int jump(int n)
{
if (n<1)
{
return 0;
}
else if (n==1)
{
return 1;
}
else if (n==2)
{
return 2;
}
else
{
return jump(n-1)+jump(n-2);
}
}
int main()
{
int s[101]={0};
int i=0;
do
{
i++;
cin>>s[i];
}
while(s[i]!=0);
for(int j=1;j<i;j++)
{
int temp=s[j];
int count = jump(temp);
cout << count << " ";
}
}
题目二描述
楼梯有n(0<n<30)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。
输入输出格式
输入格式:
输入包括一组测试数据(数量不超过100),即为台阶数n。最后一个为0,表示输入结束。
输出格式:
输出对应的结果,即为走法的数目,以空格间隔。
输入输出样例
输入样例#1: 复制
1 2 3 4 0
输出样例#1: 复制
1 2 4 7
解题思路
基本同上一题,差别在于为了到n阶台阶,存在从n-1阶、n-2阶、n-3阶三种可能,对于前阶,存在如下走法:
1台阶: 1 (1)
2台阶: 2 (11、 2)
对于3台阶: 4 (111、21:即先到2台阶,然后从2台阶一次1台阶到达3台阶
12:先到1台阶,然后从1台阶一次性跨2台阶到达3台阶
3:从0台阶一次性跨3台阶到达3台阶)
对于台阶4: 7 (1111、 211、 121、 31 :即先到3台阶,然后从3台阶一次1台阶到达4台阶
112、 22 :先到2台阶,然后从2台阶一次性跨2台阶到达4台阶
13:先到1台阶,然后从1台阶一次性跨3台阶到达4台阶)
7=4+2+1
4=2+1+1
代码1:递归
#include<bits/stdc++.h>
using namespace std;
int jump(int n)
{
if (n<1)
{
return 0;
}
else if (n==1)
{
return 1;
}
else if(n == 2)
{
return 2;
}
else if (n == 3)
{
return 4;
}
else
{
return jump(n-1)+jump(n-2)+jump(n-3);
}
}
int main()
{
int s[101]={0};
int i=0;
do
{
i++;
cin>>s[i];
} while(s[i]!=0);
for(int j=1;j<i;j++)
{
int temp=s[j];
int count = jump(temp);
cout << count << " ";
}
}
代码2:递推
#include<bits/stdc++.h>
using namespace std;
int jump(int n)
{
int ss=0,s1=0,s2=0,s3=1;
for(int i=1;i<=n;++i)
{
ss=s3+s2+s1;
s1=s2;
s2=s3;
s3=ss;
}
return ss;
}
int main()
{
int s[101]={0};
int i=0;
do
{
i++;
cin>>s[i];
}
while(s[i]!=0);
for(int j=1;j<i;j++)
{
int temp=s[j];
int count = jump(temp);
cout << count << " ";
}
}