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

uubf1zoe  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(394)

我创建了一个计算两个给定整数中所有匹配位数的方法。除了本地计数器外,该方法中的所有内容似乎都正常工作。
计数器在计算匹配位数直到最终递归迭代的过程中一直“工作”。然而,当递归工作时,最终(和期望的)值会丢失,因为之前的所有值都会循环通过,直到达到原始值。这意味着无论计数器在所有迭代过程中得到什么值,它仍然将始终返回0。
如何保存并返回计数器的最终值?任何帮助都将不胜感激,谢谢。

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;
}

注意:这个方法有很多要求和限制,导致它以这种方式编码(没有循环,没有结构化对象,必须是递归等等)。我相信有更好的办法。但是,我主要关心的是返回计数器的正确值。谢谢。

fivyi3re

fivyi3re1#

如何保存并返回计数器的最终值?
也许您应该将其重新表述为“如何保存计数器的返回值?”,答案是:使用返回值。

count = matchHelper(...);

这就解决了问题。
你其实不需要 c 参数或helper方法(如果使用 += 取而代之的是:

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种解决方案产生相同的结果( 3 )测试时使用 match(1236456789, 51782) ,自数字 5 , 7 ,和 8 是匹配的。

ryevplcw

ryevplcw2#

我认为应该在递归调用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;
}

相关问题