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

标签 java recursion

考虑这个问题:

We have triangle made of blocks. The topmost row has 1 block, the next row down has 2 blocks, the next row has 3 blocks, and so on. Compute recursively (no loops or multiplication) the total number of blocks in such a triangle with the given number of rows.

我解决这个问题的方法是这样的

public int triangle(int rows) {
  if(rows == 0 || rows == 1 ) {
    return rows;
  } else {
    return triangle(rows-1) +2;
  }
}

对于数字 3 以内的值,程序可以正常工作,但是应该输出的值是错误的(计算错误/递归调用)。我错过了什么?

提前谢谢您!

最佳答案

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

public int triangle(int rows) {
    if (rows < 1) {
        throw new IllegalArgumentException("'rows' must be positive.");
    }
    if (rows == 1) {
        return 1;
    }
    else {
        return rows + triangle(rows - 1);
    }
}

让我们举一个简单的示例,您最初使用值为 4 调用方法 triangle()。这意味着底行包含四个 block ,上面的行包含三个 block 。所以上面代码中最后一个return语句的意思是:
返回我的行中的 block 数加上三角形中我的行上方的所有 block 。

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

最终你到达顶行,那里只有一个 block ,上面没有行。因此,您不想进行另一次递归调用,因此只需返回该行中的 block 数,即 1。

因此,1 被返回到调用它的方法,该方法又返回其行数,即 2,加上被调用方法返回的 1,总共 3 依此类推,直到返回到初始调用.

关于java - 使用不带循环和乘法的递归调用来查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64032913/

相关文章:

c++ - 是否可以修复可变参数模板函数的参数?

python - 使用递归反转列表不会给出预期的输出

java - 在主要 Activity 中创建一个类

java - 单线程服务器实现多线程

java - match_parent 布局参数不起作用?

language-agnostic - 递归处理器或编程语言/编译器或两者的功能的能力吗?

coding-style - Clojure - 1 个函数的 2 个版本。哪个更地道?

javascript - 重命名对象的不定嵌套数组中的属性

java - 格式错误的 url 异常

java - 安卓 : getting an item from a textview to another textview?