0
public class MultiplyViaRecursion{

    public static void main(String[] args){

        System.out.println("8 * 9 == " + multiply(8, 9));
        System.out.println("6 * 0 == " + multiply(6, 0));
        System.out.println("0 * 6 == " + multiply(0, 6));
        System.out.println("7 * -6 == " + multiply(7, -6));
    }

    public static int multiply(int x, int y){
        int result = 0;

        if(y > 0)
            return result = (x + multiply(x, (y-1)));
        if(y == 0)
            return result;
        if(y < 0)
            return result = -multiply(x, -y);   

        return result;
    }
}

私の質問は非常に単純で基本的なものです。なぜ各「if」の後でも「return」がコンパイルを通過できないのか、エラーには行方不明の return が表示されます。

4

2 に答える 2

6

簡単に言うと、Javaコンパイラはそれほど賢くはありません。if3つのステートメントの1つがtrueと評価されなければならないことを推測することはできません 。また、コンパイラーは、すべてのif条件が失敗する可能性があると考えているため、ブロックを超える可能性があると考えています。ifその時点では、returnステートメントはありません。

代わりに、そのif elseようにブロックを使用してみてください。

public static int multiply(int x, int y) {
    int result = 0;

    if (y > 0)
        return result = (x + multiply(x, (y - 1)));
    else if (y == 0)
        return result;
    else 
        return result = -multiply(x, -y);
}
于 2012-06-22T03:21:04.097 に答える
1

コンパイラは、3つのIFがすべてのケースをカバーしていると推測できないためです。コードを単純化したい場合は、不要な最後のIFを削除できます。

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

ちなみに、result変数を削除することもできます:

public static int multiply(int x, int y){
    if(y > 0)
        return (x + multiply(x, (y-1)));
    if(y == 0)
        return 0;
    return -multiply(x, -y);   
}
于 2012-06-22T03:21:00.203 に答える