java爬楼梯问题:爬楼梯时 ,每一步会有两个选择:爬一个台阶和爬两个台阶 , 问:楼梯总台阶数为n,则一共有多少种爬法,写一个函数f,使得:总的爬法=f(n)。举例: n=3时,则共有: ( 1,1,1)、(1,2)、(2,1)三种爬法 ,则f(3)=3。
时间: 2024-09-13 14:04:00 浏览: 51
在 Java 中,这个问题通常被称为“爬楼梯”动态规划问题。这是一个经典的递归问题,可以用动态规划的方法来解决,因为它涉及到了状态转移方程。思路是定义一个数组 `f`,其中 `f[i]` 表示到达第 `i` 个台阶的不同方法数。
函数 `f(n)` 可以通过以下递推关系来计算:
- 如果可以直接达到第 `n` 个台阶,那么只有 `f[n-1]` 种方法(因为前一步只能是一个台阶);
- 否则,有两种情况:要么从第 `n-2` 个台阶走两步上来,要么从第 `n-1` 个台阶走一步上来,所以 `f(n)` 等于 `f[n-2]` 加上 `f[n-1]`。
递归形式的函数可以这样表示:
```java
public int climbStairs(int n) {
if (n <= 1) {
return n;
} else {
return climbStairs(n - 1) + climbStairs(n - 2);
}
}
```
对于给定的输入 `n`,你可以直接调用这个函数得到结果。例如,`f(3)` 的确会返回 3,就像题目中的例子所示。
相关问题
用java代码 实现 一个楼梯,每次可以爬1级或者2级,请问有多少种方式爬到顶楼
在 Java 中,这个问题通常是一个经典的动态规划问题,也被称为“爬楼梯”或“汉诺塔”变种。我们可以用一个二维数组 `dp` 来记录到达每层的不同爬法数。设 `dp[i]` 表示到达第 i 层的方式数。
初始状态,到达第一层有1种方式(直接上去),其余楼层的初始值均为0:
```java
int[][] dp = new int[n+1][2]; // n表示总层数,dp[i][j]表示到达第i层的走法,其中j=0代表走1级,j=1代表走2级
dp[1][0] = 1; // 到达第一层,只能走一级
```
然后递推公式如下:
- 要到达第 i 层,可以从第 i-1 层爬1级上,也可以从第 i-2 层爬2级上,所以有 dp[i-1][0] 和 dp[i-2][1] 种方式。
- 所以 dp[i][0] = dp[i-1][0] + dp[i-2][1]
- 同理,到达第 i 层也可以只爬2级,即从第 i-2 层,因此 dp[i][1] = dp[i-2][0]
完整代码如下:
```java
public class Staircase {
public int climbStairs(int n) {
int[][] dp = new int[n+1][2];
if (n > 0) {
dp[1][0] = 1;
dp[1][1] = 0;
}
for (int i = 2; i <= n; i++) {
dp[i][0] = dp[i - 1][0] + dp[i - 2][1]; // 走1级
dp[i][1] = dp[i - 2][0]; // 走2级
}
return dp[n][0] + dp[n][1]; // 返回总的爬法数
}
}
```
爬台阶问题 动态规划 Java 代码 简单
爬台阶问题是一个经典的动态规划问题,通常用来解释递归算法如何通过构建一个表格来避免重复计算。假设我们有一个人,他可以一次跨1阶或2阶上楼,问从楼下到楼上n阶有多少种不同的走法。我们可以用动态规划的思想解决它。
在Java中,代码大致如下:
```java
public class ClimbingStairs {
public int climbStairs(int n) {
if (n <= 2) { // 基本情况,直接返回结果
return n;
}
// 初始化一个长度为n+1的数组,dp[i]表示到达第i阶的不同走法
int[] dp = new int[n + 1];
dp[0] = 1; // 第0阶有一种走法:不爬
dp[1] = 1; // 第1阶有两种走法:一步一阶或不上
dp[2] = 2; // 第2阶有三种走法:两步一阶、一步一阶加一步、都不上
// 使用循环,自底向上填充dp数组
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2]; // 当前步数等于之前两步之和,因为可以先上1阶再上1阶,也可以先上2阶
}
return dp[n]; // 返回到达第n阶的走法总数
}
}
```
阅读全文