编程题-有n步台阶一次只能上1步或2步共有多少种走法

问题:
有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,不过可读性不如第一种算法。

觉得不错的小伙伴可以右上角点个赞或关注哟!
有任何疑问欢迎在评论中指出。

猜你喜欢

转载自blog.csdn.net/fallwind_of_july/article/details/94437690