Я создал метод, который подсчитывает количество всех совпадающих цифр из двух заданных целых чисел. Все в методе работает как надо, кроме локального счетчика.

Счетчик действительно "работает", подсчитывая количество совпадающих цифр до последней рекурсивной итерации. Однако, когда рекурсия работает, конечное (и желаемое) значение теряется, так как все предыдущие значения перебираются, пока не достигнут исходного значения. Это означает, что независимо от того, до какого значения дошел счетчик в ходе всех итераций, он все равно всегда будет возвращать 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;
}

ПРИМЕЧАНИЕ: У этого метода есть много требований и ограничений, из-за которых он был закодирован таким образом (никаких циклов, никаких структурированных объектов, должна быть рекурсия, и т.д.). Я уверен, что существует лучший способ сделать это. Однако моя главная задача - вернуть правильное значение счетчика. Спасибо.

Ответы (2)

Как я могу сохранить и вернуть конечное значение счетчика?

Может быть, вам следует перефразировать это как "Как я могу сохранить возвращаемое значение счетчика?", на что ответ таков: Использовать возвращаемое значение.

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 {
        // Проверка и подсчет
        if (strA.charAt(strA.length() - 1) == strB.charAt(strB.length() - 1)) {
            count++;
        }
        // Удалите последний символ и вызовите снова
        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) // сравниваем последнюю цифру
        count++;
    if (a >= 10 && b >= 10)
        count += match(a / 10, b / 10); // перебор с удалением последней цифры
    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 совпадают.

Я думаю, что вы должны присвоить значение count после рекурсивного вызова matchHelper, рассмотрите следующий код

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

2022 WebDevInsider