0

目的: 個別に、細谷三角形の再帰的表現を作成します。

あなたの課題: 有名な数学者である細谷春は、フィボナッチ数に基づく数の三角形配置である三角形 (以下を参照) を記述しました。ユーザーから高さを取得し、配列を使用して各行に値を格納します。細谷三角形の適切なレベル数を再帰法で出力せよ。入力が良好であると仮定しないでください。また、try...catch ブロックを実装して、誤った入力をキャッチする必要があります。

これが私がこれまでに持っているコードです:

public class HosoyaTri {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        boolean continueLoop = true;
        int num = s.nextInt();
        do {
            try {
                System.out.println("How many levels?");

                System.out.println(num + " levels");
                continueLoop = false;
            } catch (InputMismatchException im) {
                System.err.println("I said INTEGER, try again");
                s.nextLine();
            } catch (Exception e) {
                System.err.println("What did you do?");
            }
        } while (continueLoop);
        int triangle[][] = new int[num][num];
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {
                triangle[i][j] = 0;
            }
        }
        for (int i = 0; i < num; i++) {
            triangle[i][0] = 1;
        }
        for (int i = 1; i < num; i++) {
            for (int j = 1; j < num; j++) {
                triangle[i][j] = triangle[i - 1][j - 1] * triangle[i - 1][j];
            }
        }
        for (int i = 0; i < num; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print(triangle[i][j] + " ");
            }
            System.out.println();
        }
    }

}
4

1 に答える 1

1

1 つの問題は、入力ループの前にレベル数を 1 回読み取っていることです。次に、レベルを要求してnumから、ユーザーに入力を提供する機会を与えずに印刷しています! あなたはそれを修正する必要があります。に対してもテストする必要がありますnum <= 0

再帰の使い方に関する限り、細谷の三角形のエントリは再帰的に定義できます。

H 0、0 = H 1、0 = H 1、1 = H 2、1 = 1
H n、j = H n−1、j + H n−2、jまたは H n、j = H n−1、 j−1 + H n−2, j−2

別の (同等の) 定義は次のとおりです。

H n, i = F i+1 × F n−i+1

ここで、F nは次のように再帰的に定義されるn番目の フィボナッチ数です。

F 0 = 0
F 1 = 1
F n = F n-1 + F n-2 (n > 1)

これらの定義の 1 つを使用して、(与えられた引数として) 三角形の 1 つのエントリの正しい値を計算する (再帰的な) 静的メソッドをクラスに記述することをお勧めしnますjtriangle次に、変数とそれを初期化するすべてのコードを削除できます。出力ループを実行し、 の特定の要素にアクセスする再帰メソッドへの呼び出しを置き換えるだけですtriangle。(何らかの理由で三角形を明示的に作成する必要がある場合は、再帰メソッドを呼び出して各要素を初期化するだけです。余談ですが、の要素triangleを 0 に初期化する必要はありません。行列が割り当てられると、Java が自動的にそれを行います。)

于 2013-03-28T16:51:01.437 に答える