这个题目出的时候有些地方给的不是很清楚,我给出的代码会在运行结果的时候将两种方法都运行一遍,也就是会产生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:动态规划)