Java 使用不带循环和乘法的递归调用查找值

Java 使用不带循环和乘法的递归调用查找值,java,recursion,Java,Recursion,考虑一下这个问题: 我们有一个由方块组成的三角形。最上面一行有1个块,下一行有2个块,下一行有3个块,依此类推。递归计算(无循环或乘法)给定行数的三角形中的块总数 我处理这个问题的方法是 public int triangle(int rows) { if(rows == 0 || rows == 1 ) { return rows; } else { return triangle(rows-1) +2; } } 该程序可以很好地处理数字3以下的值,但是应该输出的

考虑一下这个问题:

我们有一个由方块组成的三角形。最上面一行有1个块,下一行有2个块,下一行有3个块,依此类推。递归计算(无循环或乘法)给定行数的三角形中的块总数

我处理这个问题的方法是

public int triangle(int rows) {
  if(rows == 0 || rows == 1 ) {
    return rows;
  } else {
    return triangle(rows-1) +2;
  }
}
该程序可以很好地处理数字3以下的值,但是应该输出的值是错误的(计算错误/递归调用)。我错过了什么


提前谢谢你

如果要在递归调用中添加2,请尝试添加

例如:

public int triangle(int rows) {
  if (rows < 2)
    return rows;
  else
    return triangle(rows - 1) + rows;
}
公共整数三角形(整数行){
如果(行数<2)
返回行;
其他的
返回三角形(行-1)+行;
}

你的想法是对的。从“底部”行开始,在每次递归调用中移动到上面的行,直到到达只包含一个块的顶部行。您唯一的问题是,您需要添加行数,而不是添加2。
(代码后面的解释。)

公共整数三角形(整数行){
如果(行数<1){
抛出新的IllegalArgumentException(“'rows'必须为正”);
}
如果(行==1){
返回1;
}
否则{
返回行+三角形(行-1);
}
}
让我们举一个简单的例子,最初使用值4调用方法
triangle()
。这意味着底部一行包含四个块,上面一行包含三个块。因此,上面代码中的最后一个return语句的意思是:
返回我所在行的块数加上三角形中我所在行上方的所有块数

因此方法
triangle()
使用值3调用自身。同样,返回我行中的块数加上三角形中我行上方的所有块

最后你会到达最上面的一排,那里只有一个街区,上面没有行。因此,您不希望进行另一个递归调用,因此只返回行中的块数,即1

因此,1返回给调用它的方法,该方法反过来返回它的行数,即2,加上被调用方法返回的1,总共返回三行,以此类推,直到您返回到初始调用。

我将其写成:

public int triangle(int rows) {
    return (rows <= 0) ? 0 : rows + triangle(rows-1);
}
公共整数三角形(整数行){

返回(行如果我调用
三角形(-2)
,会发生什么?@Abra,那么显然我们有问题。我们将假设没有传入负数…并且输入在代码的其他地方进行了检查。@Abra我们可以从
行==0
更改为
public int triangle(int rows) {
    return (rows <= 0) ? 0 : rows + triangle(rows-1);
}