Java: 保存递归本地计数器的值

Java: Saving the value of a recursive local counter

我创建了一个方法来计算两个给定整数中所有匹配数字的个数。除了本地计数器外,该方法中的所有内容似乎都正常工作。

计数器确实“工作”在计算匹配数字的数量一直到最终的递归迭代。然而,随着递归的工作,它会返回,最终(和期望的)值将丢失,因为所有先前的值都将循环通过,直到它达到原始值。这意味着无论计数器在所有迭代中达到什么值,它仍然总是 return 0.

如何保存和 return 计数器的最终值?任何帮助将不胜感激,谢谢。

public static int match(int a, int b) {
    return matchHelper(a, b, 0);
}

private static int matchHelper(int a, int b, int c) {
    int count = c;
    String strA = Integer.toString(a);
    String strB = Integer.toString(b);

    if (a < 0 || b < 0) {
        throw new IllegalArgumentException();
    } else {
        // Check and count
        if (strA.charAt(strA.length() - 1) == strB.charAt(strB.length() - 1)) {
            count++;
        }
        // Remove last char and call again
        if (strA.length() > 1 && strB.length() > 1) {
            strA = strA.substring(0, strA.length() - 1);
            strB = strB.substring(0, strB.length() - 1);
            matchHelper(Integer.parseInt(strA), Integer.parseInt(strB), count);
        }
    }
    return count;
}

注意:此方法有许多要求和限制,导致它以这种方式编码(没有循环,没有结构化对象,必须是递归的,等等)。我确信有更好的方法可以做到这一点。但是,我主要关心的是 return 计数器的正确值。谢谢

我认为你应该在递归调用 matchHelper 后将值赋给 count,考虑以下代码

public static int match(int a, int b) {
return matchHelper(a, b, 0);
}

private static int matchHelper(int a, int b, int c) {
int count = c;
String strA = Integer.toString(a);
String strB = Integer.toString(b);

if (a < 0 || b < 0) {
    throw new IllegalArgumentException();
} else {
    // Check and count
    if (strA.charAt(strA.length() - 1) == strB.charAt(strB.length() - 1)) {
        count++;
    }
    // Remove last char and call again
    if (strA.length() > 1 && strB.length() > 1) {
        strA = strA.substring(0, strA.length() - 1);
        strB = strB.substring(0, strB.length() - 1);
        count=matchHelper(Integer.parseInt(strA), Integer.parseInt(strB), count);
    }
}
return count;
}

How can I save and return the final value of the counter?

也许您应该将其改写为“如何保存计数器的 returned 值?”,答案是:使用 return 值。

count = matchHelper(...);

这解决了问题。


您实际上不需要 c 参数或辅助方法,如果您使用 += 代替:

public static int match(int a, int b) {
    int count = 0;
    String strA = Integer.toString(a);
    String strB = Integer.toString(b);

    if (a < 0 || b < 0) {
        throw new IllegalArgumentException();
    } else {
        // Check and count
        if (strA.charAt(strA.length() - 1) == strB.charAt(strB.length() - 1)) {
            count++;
        }
        // Remove last char and call again
        if (strA.length() > 1 && strB.length() > 1) {
            strA = strA.substring(0, strA.length() - 1);
            strB = strB.substring(0, strB.length() - 1);
            count += match(Integer.parseInt(strA), Integer.parseInt(strB));
        }
    }
    return count;
}

您的代码执行起来确实很慢,将数字转换为字符串只是为了提取最后一位数字。不要那样做,使用除法和余数。

public static int match(int a, int b) {
    if (a < 0 || b < 0)
        throw new IllegalArgumentException();
    int count = 0;
    if (a % 10 == b % 10) // compare last digit
        count++;
    if (a >= 10 && b >= 10)
        count += match(a / 10, b / 10); // recurse with last digit removed
    return count;
}

如果你坚持使用字符串,只在开始时转换一次字符串,然后“迭代”反向比较数字。

public static int match(int a, int b) {
    if (a < 0 || b < 0)
        throw new IllegalArgumentException();
    String strA = Integer.toString(a);
    String strB = Integer.toString(b);
    return matchHelper(strA, strB, strA.length() - 1, strB.length() - 1);
}
private static int matchHelper(String strA, String strB, int aIdx, int bIdx) {
    int count = 0;
    if (strA.charAt(aIdx) == strB.charAt(bIdx))
        count++;
    if (aIdx > 0 && bIdx > 0)
        count += matchHelper(strA, strB, aIdx - 1, bIdx - 1);
    return count;
}

此答案中显示的所有 4 个解决方案在使用 match(1236456789, 51782) 测试时产生相同的结果 (3),因为数字 578 匹配。