最近浏览CSDN的帖子看到了SillyBenzhu的关于列举走楼梯的解决方案,感觉挺好玩,所以试一下。
首先这个问题如果想很简单的解决就用递归法来解决,否则就用SillyBenzhu的回溯加递归的方法。
递归法
#include<stdio.h>
int f(int n)
{
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return f(n-1)+f(n-2);
}
void main(){
int n;
int s=0;
printf("input numbers of step n:");
scanf("%d",&n);
s=f(n);
printf("%d\n",s);
}
修改SillyBenzhu的回溯+递归的方法,使之可以直接适用于Windows的VC++编译器。
/*
* N阶楼梯上楼问题:一次可以走两阶或一阶,请把所有行走方式打印出来。
* 测试数据: 5 输出结果 一共有8种走法
* 测试数据: 15 输出结果 一共有987种走法
* 方案 :回溯法+递归
*/
#include <stdlib.h>
#include <stdio.h>
int a[100] = {0};
int n;
int GoUp(int level,int step)
{ //level 是a[]下标,它的含义是经过多少次(一次可以走一阶或者两阶)走完楼梯(level+1)
//step 是台阶计数 ways 是多少条路径
int i;
static int ways = 0;
if(step == n)//已经走到尽头
{
ways++;
for(i=0; i<level; i++)printf("%d\t",a[i]); //一个a[]数组是一种爬楼梯方式
printf("\n");
return ways;
}
for(i=1; i<=2; i++)//2种分支,代表该次走一阶或者两阶
{
if(step+i <= n)//判断该次走i阶是否可行
{
a[level] = i;//记录解向量
//继续递归走下一步,注意递归自动隐含level和step的回溯过程!!
GoUp(level+1,step+i);
}
}
return ways;
}
int main()
{
int i;
printf("input numbers of step n:");
scanf("%d",&n);
i = GoUp(0,0);
printf("Totally %d ways .\n",i);
return 1;
}