Java 一个孩子正在爬n级楼梯,可以跳1级、2级或3级(每次只跳一次)

Java 一个孩子正在爬n级楼梯,可以跳1级、2级或3级(每次只跳一次),java,Java,我有一个学校作业,我不知道该做什么。 问题是: 一个孩子在爬n级台阶的楼梯,一次可以跳1级、2级或3级(每次只跳一次)。实施一种方法来计算孩子可以跳上楼梯的可能方式 我知道如何编写具有固定跳转次数的代码,但不知道如何使3步跳转在每个会话中只进行一次 我有一个布尔值,我必须使用它,但我没有得到什么 static int climb3(int n, boolean can) { if (n < 0) return 0; else if (n

我有一个学校作业,我不知道该做什么。 问题是:

一个孩子在爬n级台阶的楼梯,一次可以跳1级、2级或3级(每次只跳一次)。实施一种方法来计算孩子可以跳上楼梯的可能方式

我知道如何编写具有固定跳转次数的代码,但不知道如何使3步跳转在每个会话中只进行一次

我有一个布尔值,我必须使用它,但我没有得到什么

static int climb3(int n, boolean can) {
      if (n < 0)
            return 0;
        else if (n == 0)
            return 1;
        else if(can==false)
            return climb3(n - 1,can) + climb3(n - 2,can) + climb3(n - 3,can);
}
静态整数爬升3(整数n,布尔can){
if(n<0)
返回0;
else如果(n==0)
返回1;
否则如果(can==false)
返回爬升3(n-1,can)+爬升3(n-2,can)+爬升3(n-3,can);
}
我如何在一次使用后关闭爬升3以不计算它?
谢谢

继续。你就快到了:

提示:您需要在“if-else-if…”链中最后一个“branch:分支”来处理
can==true
案例

提示2:假设
can==false
意味着您不能进行3步跳转,那么这种情况下的递归不正确


解决方案:(未测试)

静态int-gramp3(int-n,布尔值canMake3stepJump){
if(n<0){
返回0;
}else如果(n==0){
返回1;
}else if(canMake3stepJump){
返回爬升3(n-1,正确)+爬升3(n-2,正确)+
3(n-3,假);
}否则{
返回爬升3(n-1,false)+爬升3(n-2,false);
}
}

我建议您尝试了解在
canMake3stepJump
true
的情况下递归是如何工作的。编写递归调用树可能会有所帮助。

继续。您就快到了:

提示:您需要在“if-else-if…”链中最后一个“branch:分支”来处理
can==true
案例

提示2:假设
can==false
意味着您不能进行3步跳转,那么这种情况下的递归不正确


解决方案:(未测试)

静态int-gramp3(int-n,布尔值canMake3stepJump){
if(n<0){
返回0;
}else如果(n==0){
返回1;
}else if(canMake3stepJump){
返回爬升3(n-1,正确)+爬升3(n-2,正确)+
3(n-3,假);
}否则{
返回爬升3(n-1,false)+爬升3(n-2,false);
}
}

我建议您尝试理解在
canMake3stepJump
true
的情况下递归是如何工作的。写出递归调用树可能会有所帮助。

您必须澄清
的含义。“每次会话”是什么意思?我会研究排列和组合。这是一种排列:啤酒花的顺序在计数时很重要。@AaronCarson-是的。。。但是“每节课只做一次”让数学变得更复杂。你必须弄清楚
能表达什么意思。“每次会话”是什么意思?我会研究排列和组合。这是一种排列:啤酒花的顺序在计数时很重要。@AaronCarson-是的。。。但是“每节课只做一次”让数学变得更复杂了。我还是不明白重点。我无法理解如何计算正确的组合。我如何告诉程序只使用一个三步跳转。1)这是一个排列问题。秩序很重要。2) 在使用三步跳转的调用中,将
false
作为
can
值传递。。。这应该传播到整个搜索空间的子树中。这也解释了为什么您需要单独的
can==true
can==false
案例。我确实理解这一点。我不知道的是-我如何在一次使用后将can的值更改为fals。你不会更改它。将它(
false
)传递到下一个递归级别。仔细考虑一下我所理解的>>local必须是这样的:如果(can==true)返回gramp3(n-1,false)+gramp3(n-2,false)+gramp3(n-3,false);否则返回爬升3(n-1,false)+爬升3(n-2,false);在开始时,由于布尔值为true,程序通过第一个if,但由于值为false,程序无法通过下一个磁贴。我说得对吗?顺便说一句,答案是错误的,我真的不明白该修改什么。我还是不明白重点。我无法理解如何计算正确的组合。我如何告诉程序只使用一个三步跳转。1)这是一个排列问题。秩序很重要。2) 在使用三步跳转的调用中,将
false
作为
can
值传递。。。这应该传播到整个搜索空间的子树中。这也解释了为什么您需要单独的
can==true
can==false
案例。我确实理解这一点。我不知道的是-我如何在一次使用后将can的值更改为fals。你不会更改它。将它(
false
)传递到下一个递归级别。仔细考虑一下我所理解的>>local必须是这样的:如果(can==true)返回gramp3(n-1,false)+gramp3(n-2,false)+gramp3(n-3,false);否则返回爬升3(n-1,false)+爬升3(n-2,false);在开始时,由于布尔值为true,程序通过第一个if,但由于值为false,程序无法通过下一个磁贴。我说得对吗?顺便说一下,答案是错误的,我真的不明白该修改什么
static int climb3(int n, boolean canMake3stepJump) {
    if (n < 0) {
        return 0;
    } else if (n == 0) {
        return 1;
    } else if (canMake3stepJump) {
        return climb3(n - 1, true) + climb3(n - 2, true) + 
               climb3(n - 3, false);
    } else {
        return climb3(n - 1, false) + climb3(n - 2, false);
    }
}