A.Team第四题

这个题目出的时候有些地方给的不是很清楚,我给出的代码会在运行结果的时候将两种方法都运行一遍,也就是会产生2个最后一样的输出结果。我也在代码种给出了明显的注释帮助大家更好的理解,代码也有可能不是最正确的答案哈!!!

代码题目:

本关任务:一个楼梯共有n(n<10000)阶台阶,规定每步可以迈1阶、2阶或3阶。从1阶到第n阶,一共可以有多少

package 头歌A.Ateam;
import java.util.Scanner;
/**
 * 本关任务:一个楼梯共有n(n<10000)阶台阶,规定每步可以迈1阶、2阶或3阶。
 * 从1阶到第n阶,一共可以有多少种不同的迈法。(用两种方法:1:普通地递归 2:动态规划)
 * 选择一种方法即可
 */
public class Sy1_3{
    public static void main(String[] args) {
        //获得输入的台阶数
    	System.out.println("请输入1-10000之间的台阶数:");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        //防止非法输入
        while(n<=0||n>=10000) {
        	System.out.println("输入越界,请重新输入一个1-10000之间的台阶数:");
        	 n = input.nextInt();
        }
        //调用方法
        //1.普通地递归
        long all1=climbingStairs1(n);
        System.out.println(all1);
        //2.动态规划
         long all2=climbingStairs2(n);
        System.out.println(all2);                   
    }
    /**
     * 普通地递归,自顶向下求解
     * @param n 台阶数
     * @return 迈法总数
     */
    //1.普通调用
    public static long climbingStairs1(int n) {
        //递归终止条件
    	//剩余台阶为1时,只有1种迈法,迈1阶
        if(n==1){
            return 1;
        }
        //剩余台阶为2时,有2种迈法,迈2次1阶和一次迈2阶
        if(n==2){
        return 2;
        }
        //剩余台阶为3时,有4种迈法,迈3次一阶、先迈一次1阶再迈一次2阶、先迈一次2阶再迈一次1阶、迈2次2阶
        if(n==3){
            return 4;
        }
        //运用递归调用,采用分类加数计数原理相加,从而得到迈法总数
        return climbingStairs1(n-1)+climbingStairs1(n-2)+climbingStairs1(n-3);
    }
    /**
     * 动态规划,自底向上求解
     * @param n 台阶数
     * @return 迈法总数
     */
    //2.动态规划
   public static long climbingStairs2(int n) {
	   //创建数组,注意后面+3是为了防止数组越界
        int []mxy=new int [n+3];
        //初始化数组
        mxy[1]=1;
        mxy[2]=2;
        mxy[3]=4;
        //与上面普通递归方法相同
        for(int i=4;i<=n;i++){
            mxy[i]=mxy[i-1]+mxy[i-2]+mxy[i-3];
        }
        return mxy[n];
    }
}

种不同的迈法。(用两种方法:1:普通的递归 2:动态规划)

猜你喜欢

转载自blog.csdn.net/foxmaxiaoyu/article/details/124578379