一、第一次作业:
(一)题目:爬楼梯问题:有n阶楼梯,允许一步跨1阶、2阶或3阶,试问用m步正好走完楼梯的情况有多少种?给出所有可能情况的具体结果。举例:n=6,m=3,用3步正好走完6阶楼梯的情况有7种,分别为1-2-3,1-3-2,2-1-3,2-2-2,2-3-1,3-1-2,3-2-1。
(二)代码
#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;
int *steps; //用指针steps形成数组来表示每一步走的阶数
int m; //由于函数要用到m,故设置为全局变量
int cnt = 0; //统计共有几种方法。
void find(int n, int remaining_steps); //寻找每一种爬的方式并打印
int main(void)
{
int n,remaining_steps;
int i,j;
cout<<"请输入楼梯阶数n:";
cin>>n;
cout<<"请输入爬完楼梯的步数m:";
cin>>m;
remaining_steps = m;
steps = (int*)malloc(sizeof(int) * m);
cout<<"所有爬楼梯的方法如下:"<<endl;
find(n, remaining_steps);
cout<<"共有"<<cnt<<"种爬楼梯的方法。"<<endl;
}
void find(int n,int remaining_steps) //递归函数来列出每一种情况
{
int i;
if(remaining_steps==0)
{
if(n == 0) //remaining_steps和n均为0表示用规定的步数爬完了阶梯
{
cnt++;
cout<<"第"<<cnt<<"种:";
cout<<steps[0];
for(i = 1; i < m; i++)
{
cout<<"-"<<steps[i];
}
cout<<endl;
}
}
else
{
for(i = 1; i <= 3; i++)
{
steps[m-remaining_steps] = i; //表示每一步爬几阶
find(n-i,remaining_steps-1); //不断递归到用完步数或者爬完楼梯
}
}
}