问题:
有n步台阶,一次只能上1步或2步,请共有多少种走法,请使用编程实现。
编程题实现:
方法1-递归
//实现f(n):求n步台阶,一共有几种走法
public int f(int n){
if(n<1){
throw new IllegalArgumentException(n + "不能小于1");
}
if(n==1 || n==2){
return n;
}
return f(n-2) + f(n-1);
}
方法2-迭代循环
这个算法很难理解,如果有解读清楚的伙伴,还望留言评论。
public static int loop(int n){
if(n<1){
throw new IllegalArgumentException(n + "不能小于1");
}
if(n==1 || n==2){
return n;
}
int one = 2;//初始化为走到第二级台阶的走法
int two = 1;//初始化为走到第一级台阶的走法
int sum = 0;
for(int i=3; i<=n; i++){
//最后跨2步 + 最后跨1步的走法
sum = two + one;
two = one;
one = sum;
}
return sum;
}
其他方法(自己编的):
测试的时候发现n<=23时均正确,大于23时就会出现错误,个人认为可能是数值溢出的问题,也有可能是下面代码存在一定的问题,如果有哪位大神能帮忙解释一下,那将不胜感激!
public class Step {
//发现规律,使用排列的形式来计算,根据2的个数来排列
//例如n=6时,结果是A(6,0)+A(5,1)+A(4,2)+A(3,3)。
//以上分别代表0个两步,1个两步,2个两步和3个两步的排列情况。
public static void main(String[] args) {
System.out.println(stepSum(6));
}
public static int stepSum(int n){
//实现a和b的自动变化,然后实现排列
//a最大为n,此时b最小且为0
//a--时,b++,但b<=a时一直这样执行,每次结果求和;
if(n==0){return 0;}
int sum = 0;
int a=n,b=0;
while(b<=a){
sum=sum+A(a,b);
a--;
b++;
}
return sum;
}
public static int A(int a,int b){
int sum=1;
for(int i=1;i<=b;i++){
sum=sum*a;
a--;
}
return sum/Chen(b);
}
public static int Chen(int x){
int sum=1;
for(int i=1;i<=x;i++){
sum=sum*i;
}
return sum;
}
}
对于n=40,第一种算法,时间700ms,第二种算法,时间<1ms,不过可读性不如第一种算法。
觉得不错的小伙伴可以右上角点个赞或关注哟!
有任何疑问欢迎在评论中指出。