Java:为什么我的Euclid GCD函数返回不正确的值

时间:2014-10-04 21:22:16

标签: java recursion return

我是编程新手,我正在使用Think Java学习Java。我想做exercise 10 of chapter 6。该练习涉及使用Euclid算法编写递归函数以找到最大公约数(GCD)。我提出了2个想法。我不确定为什么我的第二个想法会返回不正确的值。

这个想法很好用:

public class exercise10 {
    public static int gcd(int a, int b) {
        if (b == 0) return a;
        else return gcd(b, a % b);
    }
    public static void main(String[] arguments){
        System.out.println(gcd(36,20));
    }
}

这个想法会返回一个不正确的值:

public class exercise10 {
    public static int gcd(int a, int b) {
        if (b > 0) {
            int r = a % b;
            gcd(b, r);
        }
        return a;
    }
    public static void main(String[] arguments){
        System.out.println(gcd(36,20));
    }

}

这不是任何课堂作业的一部分。我只是使用开源教科书来自学java。

在Win64计算机上运行java版本1.7.0_51

1 个答案:

答案 0 :(得分:0)

BorisTheSpider已经指出了我的代码出了什么问题,但他的帖子却被删除了。无论如何,他指出我的第二个想法是在递归函数return前面缺少gcd(b, r)语句。

public class exercise10 {
    public static int gcd(int a, int b) {
        if (b > 0) {
            int r = a % b;
            gcd(b, r); <--- missing return
        }
        return a;
    }
    public static void main(String[] arguments){
        System.out.println(gcd(36,20));
    }

}

所以正确的代码应该是:

public class exercise10 {
    public static int gcd(int a, int b) {
        if (b > 0) {
            int r = a % b;
            return gcd(b, r);
        }
        return a;
    }
    public static void main(String[] arguments){
        System.out.println(gcd(36,20));
    }

}

对BorisTheSpider的信用。