小白上楼梯(递归设计)
小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶, 2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
思路图解
1.递归图解
2.动态规划法图解
代码实现(三种方法:递归解法&迭代解法&动态规划法)
package LanQiao;
import java.util.Scanner;
/*
* 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶, 2阶 或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
*/
public class Demo07
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (true)
{
System.out.println("输入台阶数");
int n = sc.nextInt();
int res = f(n);
int res1 = f1(n);
int res2 = climbStairs1(n);
System.out.println("一共有" + res + "种走法");
System.out.println("===========");
System.out.println("一共有" + res1 + "种走法");
System.out.println("++++++++++++");
System.out.println("一共有" + res2 + "种走法");
}
}
//递归解法(斐波那契)
private static int f(int n)
{
if (n == 0)
return 1;
if (n == 1)
return 1;
if (n == 2)
return 2;
return f(n - 1) + f(n - 2) + f(n - 3);
}
//迭代解法
public static int f1(int n)
{
if (n < 0)
return 0;
if (n == 0 || n == 1)
return 1;
if (n == 2)
return 2;
if (n == 3)
return 4;
int x1 = 1;
int x2 = 2;
int x3 = 4;
for (int i = 4; i <= n; i++)
{
int temp = x1;
x1 = x2;
x2 = x3;
x3 = (x1 + x2 + temp);//注意此处
}
return x3;
}
//动态规划
public static int climbStairs1(int n)
{
if (n <= 1)
{
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
}