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

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

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

计数器在计算匹配位数直到最终递归迭代的过程中一直“工作”。然而,当递归返回时,最终(和期望的)值会丢失,因为之前的所有值都会循环,直到达到原始值。这意味着,无论计数器在所有迭代过程中得到什么值,它都将始终返回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;
}
公共静态int匹配(int a,int b){
返回matchHelper(a、b、0);
}
私有静态int matchHelper(int a、int b、int c){
整数计数=c;
字符串strA=整数。toString(a);
字符串strB=Integer.toString(b);
if(a<0 | | b<0){
抛出新的IllegalArgumentException();
}否则{
//清点
if(strA.charAt(strA.length()-1)=strB.charAt(strB.length()-1)){
计数++;
}
//删除最后一个字符并再次调用
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);
}
}
返回计数;
}

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

我认为在递归调用MatHelelver之后,应该将值分配给计数,考虑下面的代码

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;
}
公共静态int匹配(int a,int b){
返回matchHelper(a、b、0);
}
私有静态int matchHelper(int a、int b、int c){
整数计数=c;
字符串strA=整数。toString(a);
字符串strB=Integer.toString(b);
if(a<0 | | b<0){
抛出新的IllegalArgumentException();
}否则{
//清点
if(strA.charAt(strA.length()-1)=strB.charAt(strB.length()-1)){
计数++;
}
//删除最后一个字符并再次调用
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);
}
}
返回计数;
}
如何保存并返回计数器的最终值

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

count=matchHelper(…);
这就解决了问题


如果改用
+=
,则实际上不需要
c
参数或helper方法:

公共静态int匹配(int a,int b){
整数计数=0;
字符串strA=整数。toString(a);
字符串strB=Integer.toString(b);
if(a<0 | | b<0){
抛出新的IllegalArgumentException();
}否则{
//清点
if(strA.charAt(strA.length()-1)=strB.charAt(strB.length()-1)){
计数++;
}
//删除最后一个字符并再次调用
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));
}
}
返回计数;
}
您的代码运行速度非常慢,将数字转换为字符串只是为了提取最后一个数字。不要这样做,使用除法和余数

公共静态int匹配(int a,int b){
if(a<0 | | b<0)
抛出新的IllegalArgumentException();
整数计数=0;
if(a%10==b%10)//比较最后一位数字
计数++;
如果(a>=10&&b>=10)
count+=匹配(a/10,b/10);//删除最后一位后递归
返回计数;
}
如果您坚持使用字符串,那么在开始时只转换为字符串一次,然后向后“迭代”比较数字

公共静态int匹配(int a,int b){
if(a<0 | | b<0)
抛出新的IllegalArgumentException();
字符串strA=整数。toString(a);
字符串strB=Integer.toString(b);
返回matchHelper(strA,strB,strA.length()-1,strB.length()-1);
}
私有静态int-matchHelper(字符串strA、字符串strB、int-aIdx、int-bIdx){
整数计数=0;
如果(标准字符(aIdx)=标准字符(bIdx))
计数++;
如果(aIdx>0&&bIdx>0)
计数+=匹配助手(strA、strB、aIdx-1、bIdx-1);
返回计数;
}

当使用
匹配(123645678951782)
进行测试时,此答案中显示的所有4个解决方案都会产生相同的结果(
3
),因为数字
5
7
8
是匹配的。

谢谢!就是这样。所有这些都以一种容易理解的方式表达出来。另外,感谢您向我展示如何改进我的代码。谢谢你花时间解释这一切。