-1

ブロックでできた三角形があります。一番上の行には 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);
  }
}
4

3 に答える 3

3

単純な再帰関数を書くときは、それを「基本ケース」(停止するとき)と再帰するときのケースに分割すると便利です。どちらの場合も何かを返す必要がありますが、再帰的な場合は、ある時点で関数を再度呼び出すことになります。

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

再帰的定義をさらに調べると、「末尾再帰」のアイデアが見つかります。これは、スタックをオーバーフローさせない特定のコンパイラの最適化を可能にするため、通常は最適です。私のコード例は単純で正しいものですが、末尾再帰ではありません。

于 2013-02-08T12:14:17.113 に答える
2

関数の戻り値を利用していません。代わりに、常に新しいローカル変数を宣言します。それ以外の場合、ソリューションは正しいソリューションに非常に近くなります。returnまた、行 0 でない場合に備えて、別の行を追加する必要があります。

于 2013-02-08T11:50:17.680 に答える
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;
}
于 2013-02-08T11:57:48.937 に答える