首页 > 解决方案 > 1 - 10000 Java 之间友好数的递归方法

问题描述

我在创建用于查找 1 - 10000 之间的 Amicable 数字的递归方法时遇到问题。我创建了一个方法来确定两个数字是否是 Amicable,但我不知道如何针对每个可能的数字组合运行它。这是我写的两种方法。

public void amicable(int n, int m) {
    int sumM = 0;
    int sumN = 0;

    for (int i = 1; i < n; i++) {
        if (n % i == 0) {
            sumN += i;
        }
    }

    for (int j = 1; j < m; j++) {
        if (m % j == 0) {
            sumM += j;
        }
    }

    if (sumN == m && sumM == n) {
        System.out.println(n + " and " + m + " are amicable numbers");
    }
}

public static void amicableBetween(int n, int m) {
    int sumaM = 0;
    int sumaN = 0;
    if (m >= 1) {

        for (int j = 1; j < m; j++) {
            if (m % j == 0) {
                sumaM += j;
            }
        }

        for (int i = 1; i < n; i++) {
            if (n % i == 0) {
                sumaN += i;
            }
        }

        if (sumaN == m && sumaM == n) {
            System.out.println(n + " and " + m + " are amicable numbers");
            amicableBetween(n + 1, m - 1);
        } else {
            System.out.println(n + " i " + m + " aren't amicable numbers");
            amicableBetween(n + 1, m - 1);
        }
    }
}

}

标签: javarecursion

解决方案


次要免责声明,这种方法可能需要很长时间,而且您可能会用完堆栈空间,所以我不能 100% 确定递归地计算 1-10000 的所有友好数字是要走的路。如果这只是为了好玩或练习,那么我想没问题。


一种方法是扫描n,直到我们到达m - 1并调用amicable(n,m)每一步。一旦n达到m - 1,我们可以减少m1重复该过程,直到n is equal to m - 1我们检查了所有可能的组合。为此,您可以将两种方法分解为三种方法。

第一个方法是amicable您已经拥有的方法,只是更改了返回类型,以便我们可以在沿着递归链下行时重用它:

public static boolean amicable(int n, int m) {
    int sumM = 0;
    int sumN = 0;

    for (int i = 1; i < n; i++) {
        if (n % i == 0) {
            sumN += i;
        }
    }

    for (int j = 1; j < m; j++) {
        if (m % j == 0) {
            sumM += j;
        }
    }

    return sumN == m && sumM == n;
}

第二个是public方法amicableBetween(int n, int m)

public static void amicableBetween(int n, int m) {

    amicableBetween(n, m, true);
}

它将调用第三个private辅助方法amicableBetween(int n, int m, boolean start),该方法具有第三个参数start,可用于识别是否n已达到m。然后我们需要减少m1重复这个过程:

private static void amicableBetween(int n, int m, boolean start) {

    if(n == m) {
        return;
    }

    if (m >= 1) {

        if (amicable(n, m)) {
            System.out.println(n + " and " + m + " are amicable numbers");
        } else {
            System.out.println(n + " and " + m + " aren't amicable numbers");
        }
        amicableBetween(n + 1, m, false);
    }
    if(start) {
        amicableBetween(n, m - 1, true);
    }
}

推荐阅读