11
public static int multiply2(int num1, int num2) {
    if (num1 == 0 || num2 == 0) {
        return 0;
    }

    else {
        return num1 + multiply2(num1, num2 - 1);
    }

}

1 つまたは両方が負である 2 つの数値の積を決定できるプログラムを作成するのは楽しいだろうと気付きました。再帰乗算(基本的に繰り返し加算)を使ってやりたいです。誰か助けてくれませんか?ありがとう!

4

8 に答える 8

9
if (num1 == 0 || num2 == 0) {
        return 0;
}

else if( num2 < 0 ) {
    return - num1 + multiply2(num1, num2 + 1);
}

else {
    return num1 + multiply2(num1, num2 - 1);
}
于 2012-10-05T07:11:24.037 に答える
3
else if (num1 < 0 || num2 < 0) {
    int signum1 = num1 < 0 ? -1 : 1;
    int signum2 = num2 < 0 ? -1 : 1;
    return signum1 * signum2 * multiply(signum1 * num1, signum2 * num2);
} else {

そんな感じ

注:signum機能があり、次のMath.abs目的で使用できますsignum * num

于 2012-10-05T07:12:53.153 に答える
2

負かどうかをテストし、加算する代わりに減算します。

public static int multiply2(int num1, int num2) {
    if (num1 == 0 || num2 == 0) {
        return 0;
    }
    else if(num2 > 0){
        return num1 + multiply2(num1, num2 - 1);
    }
    else{
        return -num1 + multiply2(num1, num2 + 1);
    }
}
于 2012-10-05T07:09:55.210 に答える
1

number が -ve の場合は追加する必要があります。最初の数値のみを追加していることがわかれば、2 番目の数値条件では に到達する必要があり0ます。したがって、負の+1場合は正の場合-1

        else if (num2 < 0)
            return -num1 + multiply2(num1, num2 + 1);
         else
            return num1 + multiply2(num1, num2 - 1);

    System.out.println(multiply2(5, -6));-->-30
    System.out.println(multiply2(5, 6));-->30
于 2012-10-05T07:13:26.813 に答える
0

さて、私は実際に宿題のためにこれに取り組んでいます。再帰的ソリューションは、続行する必要があるかどうかを判断する基本ケースを実装 (または使用) します。さて、あなたは「いったいそれはどういう意味ですか?」と言うかもしれません。簡単に言えば、これはコードを単純化できる (そして実際には、ソフトウェアのオーバーヘッドをいくらか節約できる) ことを意味します。これについては後で説明します。ここで、問題の一部は基本的な数学を理解することです。つまり、マイナスのプラスマイナスはマイナスまたはマイナスのプラス(-1 + -1 = -2) は、あなたが話す数学の先生によって異なります (以下のコードでそれが機能することを確認してください)。

さて、ここいくつかの議論が必要です。それについては、後で書きます。

これが私のコードです:

public static int multiply(int a, int b)
{
    if (a == 0) 
    {
        return result;
    } 
    else if (a < 0) // Here, we only test to see whether the first param.  
                    // is a negative
    {
        return -b + multiply(a + 1, b); // Here, remember, neg. + neg. is a neg.
    }                                   // so we force b to be negative.
    else 
    {
        result = result + b;
        return multiply(Math.abs(a - 1), b);
    }
}

ここでは、2 つの異なる処理が行われていることに注意してください。

  1. 上記のコードはa < 0、最初の段落の数学的原理 (最初の段落の太字を参照) により、2 番目のパラメーターが負 ( ) かどうかを確認するために 2 番目のパラメーターをテストしません。基本的に、( y ) に負の数 ( -n ) を掛けていることがわかっている場合は、 -nを取り、それをy回足していることがわかります。したがって、被乗数または乗数が負の場合、どちらかの数値を取り、その数値を負にして、その数値を自分自身に何度も追加できることがわかっています。たとえば、-3 * 7 と書くことができます (-3) + ( -3) + (-3) + (-3)... などOR (-7) + (-7) + (-7)

  2. ここで議論が必要です:int b上記のコードは、2 番目の数値 ( ) がであるかどうか0、つまり を掛けるかどうかをテストしていません0。なんで?まあ、それは個人的な選択です(一種)。ここでの議論は、何かの相対的な重要性を比較検討する必要があります。つまり、各選択 (equals-zero テストを実行するかどうか) のオーバーヘッドです。一方がゼロかどうかをテストする場合、multiply の再帰呼び出しが行われるたびに、コードは式を評価する必要があります。ただし、ゼロに等しいかどうかをテストしない場合、コードは一連のゼロをn回追加します。実際には、どちらの方法も「重さ」は同じなので、メモリを節約するためにコードを省略します。

于 2014-05-26T23:16:17.917 に答える
0
public static int multiply2(int num1, int num2) {
    if (num1 == 0 || num2 == 0) {
        return 0;
    }

    else {
        int sign2=(int)(Math.abs(num2)/num2);
        return sign2*num1 + multiply2(num1,num2-sign2);
    }

}
于 2012-10-05T07:13:24.603 に答える
0

David Wallace の答えは良いですが、入力が (1,124) または (-1,124) の場合、再帰の深さ (メソッドがそれ自体を呼び出す回数) は 123 になり、あまり効率的ではありません。1 または -1 をテストするために数行追加することをお勧めします。完全な例を次に示します。

public class Multiply {

    public static void main(String[] args) {

        System.out.print("product = " + multiply(1, 124) );
    }

    public static int multiply(int x, int y) {
        System.out.println("Multiply called: x = " + x + ", y = " + y);

        if (x == 0 || y == 0) {
            System.out.println("Zero case: x = " + x + ", y = " + y);
            return 0;
        }

        else if (x == 1 && y > 0) {
            return y;
        }

        else if (y == 1 && x > 0) {
            return x;
        }

        else if ( x == -1 && y > 0) {
            return -y;
        }

        else if ( y == -1 && x > 0) {
            return -x;
        }

        else if( y == -1 ) {
            System.out.println("y is == -1");
            return -x;
        }

        else if( x == -1 ) {
            System.out.println("x is == -1");
            return -y;
        }

        else if( y < 0 ) {
            System.out.println("y is < 0");
            return -x + multiply(x, y + 1);
        }

        else { 
            System.out.println("Last case: x = " + x + ", y = " + y);
            return x + multiply(x, y - 1);
        }
    }
}

出力:

Multiply called: x = 1, y = 124
product = 124
于 2013-06-03T20:10:48.530 に答える