递归无法做到这一点

时间:2013-02-08 11:47:24

标签: java

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

triangle(0) → 0
triangle(1) → 1
triangle(2) → 3

这是我的代码:

public int triangle(int rows) {
  int n = 0;

  if (rows == 0) {
    return n;
  } else {
    n = n + rows;
    triangle(rows - 1);
  }
}

3 个答案:

答案 0 :(得分:2)

您没有使用函数的返回值。相反,您总是声明一个新的局部变量。否则你的解决方案非常接近正确的解决方案。另外,如果您不在第0行,还应添加另一个return

答案 1 :(得分:2)

当编写一个简单的递归函数时,它有助于将其拆分为“基本情况”(停止时)和递归时的情况。两种情况都需要返回一些东西,但递归的情况是在某个时候再次调用该函数。

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

如果你进一步研究递归定义,你会发现“尾递归”的概念,这通常是最好的,因为它允许某些编译器优化不会溢出堆栈。我的代码示例虽然简单而正确,但不是尾递归。

答案 2 :(得分:0)

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