乘法没有乘法,除法和按位运算符,没有循环。递归

时间:2012-06-22 03:14:32

标签: java algorithm

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”之后“返回”仍然无法通过编译,错误显示缺少返回。

2 个答案:

答案 0 :(得分:6)

简单地说:Java编译器并不那么聪明。它无法推断出您的三个if语句中的一个必须评估为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);
}

答案 1 :(得分:1)

因为编译器无法猜测您的三个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);   
}