StackOverflowError用于使用递归函数查找2个数字的共素对 - 我们可以将其转换为迭代

时间:2014-05-28 04:28:20

标签: java algorithm recursion prime-factoring greatest-common-divisor

我想计算(m,n)对的数量,其中GCD(m,n)= x,比如x = 1且1 <= m <= M = 10 ^ 5且1 <= n <= N = 10 ^ 5。

M和N将被给予

注意:我只想要可能的对数而不是对。

时间限制:5秒

下面的代码适用于小数字,但对于较大的代码,它会给我StackOverflowError

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class TestClass{
static long M;
static long N;
static long totalCount = 1;

public static void main(String[] args) throws Exception{
    M = 100000;
    N = 2000;
    findCoPrimes(2, 1);
    findCoPrimes(3, 1);
    System.out.println(totalCount);
}

public static void findCoPrimes(int m, int n){
    if ((n > N) || (m > M)){
        return;
    }
    if (n != m && m <= N){
        totalCount++;
    }
    totalCount++;
    findCoPrimes(2*m - n, m);
    findCoPrimes(2*m + n, m);
    findCoPrimes(m + 2*n, n);
}
}

有人可以帮助我将这个递归函数转换为迭代函数,以避免StackOverflow错误。

请帮我找到解决方法。还将考虑任何其他更好的方法。这个问题有一个提示 - 使用智能方法找到素因子,然后找到共素对的数量。蛮力不会工作。

1 个答案:

答案 0 :(得分:2)

要转换为迭代函数,您可以创建用于模拟函数堆栈的堆栈对象。

使用堆栈对象将允许您将状态存储在堆中而不是堆栈usually set to 256K by default

请参阅此处转换为迭代的一般方法:https://stackoverflow.com/a/159777/276949