Является ли увеличение аргумента функции хорошим способом обновить «счетчик» с помощью рекурсии?

Я практикуюсь с рекурсией и смотрю на вопрос:

"Напишите рекурсивную программу, входными данными которой являются массив A и число x. Программа должна вывести количество вхождений x в A".

Это мое рабочее решение:

public int countOccurrencesOfX_Recursive(int[] array, int x, int index, int occurrences) {
    if (index == array.length) {
        return occurrences;
    }
    if (array[index] == x) {
        return countOccurrencesOfX_Recursive(array, x, index+1, occurrences+1);
    } else {
        return countOccurrencesOfX_Recursive(array, x, index+1, occurrences);
    }
}

Я не мог придумать другого способа сделать это без введения дополнительных аргументов функций. Это не кажется замечательным, потому что это зависит от аргумента вхождения, установленного на 0, но пользователь может ввести любое целое число, которое ему нравится. Мой вопрос в том, считается ли это хорошим способом ведения счетчика при использовании рекурсии, а если нет, то как бы вы это сделали?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Обычное решение этой проблемы состоит в том, чтобы иметь нерекурсивную функцию публичный, которую вызывают ваши пользователи, которая, в свою очередь, вызывает рекурсивную функцию частный.

Например:

public static int recursiveCount(int[] array, int value) {
    return recursiveCountInternal(array, value, 0, 0);
}

private static int recursiveCountInternal(int[] array, int value, int index, int count) {
    if (index == array.length) {
        return count;
    }
    if (array[index] == value) {
        count++;
    }
    return recursiveCountInternal(array, value, index + 1, count);
}

Это здорово, только что изменил свое решение на то же самое, что вы только что опубликовали :) это отличный совет, приветствую человека

PumpkinBreath 07.05.2019 22:08

На самом деле это можно сделать одним методом без переменной count в качестве одного из параметров.

user3437460 07.05.2019 22:21

Я видел этот стиль рекурсии раньше, и он выглядит нормально.

Что вы можете сделать, так это создать перегруженную функцию, которая просто вызывает эту функцию с начальным значением occurrences, равным 0, например:

public int countOccurrencesOfX_Recursive(int[] array, int x, int index) {
    return countOccurrencesOfX_Recursive(array, x, index, 0);
}

и сделать рекурсивную функцию приватной. Это избавит вас от опасений, что пользователи введут любое число.

Вы можете вернуть 1+результаты из остальной части строки.

private static int countOccurencesofIntInarrayRec(Integer[] nums, int target){
    if (nums == null || nums.length==0) return 0;
    int addNum = nums[0]==target?1:0;
    return  countOccurencesofIntInarrayRec(Arrays.copyOfRange(nums, 1, nums.length),target) + addNum;
}

Другие вопросы по теме