0

追加情報:

チップは乗算をサポートせず、加算のみをサポートします。この問題を回避するには、x をそれ自体に y 回追加することで x と y の乗算を実行する再帰メソッド mult() を作成します。引数は x と y で、戻り値は x と y の積です。次に、メソッドとそれを呼び出す main() を記述する必要があります。

純粋な論理的思考ですが、どうしようかと考えるたびに迷ってしまいます。

私は数学の部分で立ち往生しています..私が持っているもの、それは機能せず、数学が間違っていることは知っていますが、私はこれが得意ではありません:

public static void mult(int x, int y) {
    x = 0;
    y = 0;
    if (y > 0) {
        for (int i = 0; i < y; i++) {
            x = x * (x * y);
            return mult(x, y);
        }
    }
}
4

6 に答える 6

10

「再帰」と聞くと、次の 2 つのことがわかると思います。

  1. 毎回変更された引数で自分自身を呼び出す関数。
  2. いつ停止するかを関数に指示し、無限スタックを回避する停止条件が一番上にあります

それで、あなたのはどこですか?コードを書く前に、それらを言葉で書き留めることから始めましょう。

于 2013-09-28T12:40:03.857 に答える
2

... x をそれ自体に y 回追加します。

乗算する代わりに、実際にそれを行うことができます。ああ、もし x と y の両方をゼロに設定しなければ、何か追加する必要があるかもしれません ;-)

最後にもう 1 つ: 再帰的なソリューションが必要な場合は、for ループは必要ありません。

于 2013-09-28T12:40:16.623 に答える
2

覚えておく必要があるのは、乗算は加算の繰り返しであることです (両方のオペランドが であると仮定>= 0します)。したがって、次のようになります。

  • 基本ケースはyがゼロの場合
  • yがゼロでない場合は、xもう 1 回足し1てから引きます。y

が正である限り、y最終的に値がゼロになることに注意してください。したがって、基本的にはx合計回数を追加し続けyます。これが私の言いたいことです:

public static int mult(int x, int y) {
    if (y == 0)
        return 0;
    return x + mult(x, y-1);
}

同じコードを末尾再帰スタイルで書くこともできます- つまり、再帰呼び出しが戻った後に何もする必要がなく、これは、いわゆる末尾呼び出しの最適化をサポートする特定の言語にとって重要です。

public static int mult(int x, int y, int accumulator) {
    if (y == 0)
        return accumulator;
    return mult(x, y-1, x + accumulator);
}

上記は次のように呼び出され、最後のパラメーターは常にゼロで初期化されることに注意してください。

mult(10, 5, 0)
=> 50
于 2013-09-28T12:40:58.910 に答える
1
public static int mult(int x, int y) {
        if (y == 0) {
            return 0;
        }
        if (y > 0) {
            return x + mult(x, y - 1);
        } else {
            return -x + mult(x, y + 1);
        }
    }

ちなみにこれが解決策でした

于 2013-10-25T09:58:38.340 に答える