2013-01-08 112 views
1

我试图创建代码来找到三个用户输入数字的GCD。我的目标是用输入数字调用该方法,除以初始化为1的q,只有余数为零才记录q,然后确定它是否大于或等于最小数目,如果不是,则增加q和回忆的方法,但如果是我想打印出最大记录的最大q,我做错了什么?我不断收到堆栈溢出错误。递归困境

public static int recursiveMethod (int x, int y, int z, int q) 
{ 
    int largestVar; 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes==0 && yRes ==0 && zRes==0) { 
       largestVar = q; 
       if (q >= x && q >= y && q >= z) 
       { 
        return largestVar; 
       } 
    } 
    else { 
      q++; 
    } 
    return recursiveMethod(x, y, z, q); 
+0

您可以执行多少次递归存在限制,这受限于堆栈深度。所以我建议你检查一下你的算法,如果有必要的话把它变成一个迭代的一个 –

回答

1

你第一种情况将是1,此时,xRes==0 && yRes ==0 && zRes==0肯定是真实的,并设置largestVar为1。然后,因为1是不太可能比传入的变量,它继续,不在else块中增加q,并再次调用recursiveMethod q = 1!这个过程重演。

public static int recursiveMethod (int x, int y, int z, int q, int largestVar) 
{ 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes==0 && yRes ==0 && zRes==0) { 
    //A common denominator found! 
       largestVar = q; 
    } 
    //regardless whether a denominator was found, check for the termination condition 
    //Or works here, by the way, since we only need to know when q is greater than one of them. 
    if (q >= x || q >= y || q >= z) { 
     return largestVar; 
    } 
    //if we don't terminate, increment q and recurse. 
    q++; 
    return recursiveMethod(x, y, z, q, largestVar); 
} 

修改为正确处理largestVar。没有注意到那一点。在本地范围内,maximumVar的值不会通过递归调用进行维护,因此它也必须传递给recursiveMethod调用(或者声明为类范围变量或其他类)。一个合适的起始值为0.

+0

谢谢!我实际上试过这个代码,但每次我试图编译它时,我总是得到“变量最大的变量可能没有被初始化”。我还得到了一个“丢失的返回语句”,该语句应该放在方法中,但在if/else语句 – Jay

+0

以外修改为正确处理'largestVar'。当时并没有真正考虑这方面的问题。 – femtoRgon

4

一个我注意到的失误,你如果条件是错误的:

if (q >= x && q >= y && q >= z) 

这3个数字的GCD小于或等于每个人,所以将其更改为:

if (x >= q && y >= q && z >= q) 

如果您正在像这样反复测试数字,您应该从一定数量和倒数开始,以确保满足条件的数字是实际的GCD。而且这个起始号码必须是最少3个号码的 并充分工作的方法的版本是在这里:

public static int recursiveMethod(int x, int y, int z, int q) 
{ 
    int largestVar; 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes == 0 && yRes == 0 && zRes == 0) { 
     largestVar = q; 
     if (x >= q && y >= q && z >= q) { 
      return largestVar; 
     } 
    } else { 
     q--; 
    } 
    return recursiveMethod(x, y, z, q); 
} 

样品电话:

int x = recursiveMethod(30, 60, 45, 30); // x = 15 after this execution. 
+0

哇。我是个傻瓜,非常感谢你! – Jay

+0

我将&&更改为||为此,它工作正常!不过,现在我得到了“xRes” – Jay

+0

的stackoverflow哦,我明白了。我对这件事的看法更加复杂。因为我需要这个程序来处理随机输入的数字。 – Jay

2

不要忘记gcd(x, y, z) = gcd(gcd(x, y), z).所以,如果你想有一个简单的算法,可以实现与GCD两个数字,然后调用该方法的3个数字。

public static int GCD(int x, int y) { 
    if (y == 0) return x; 
    return GCD(x, x % y); 
} 

然后为三个数字:

public static int GCDfor3 (int x, int y, int z) { 
    return GCD(GCD(x, y), z) 
}