Инкремент аргумента функции является хорошим способом обновления "счетчика" с помощью рекурсии? - PullRequest
0 голосов
/ 07 мая 2019

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

" Напишите рекурсивную программу, чьи входные данные - это массив 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, но пользователь может ввести любое целое число, которое ему нравится. Мой вопрос: считается ли это хорошим способом сохранить счетчик при использовании рекурсии, а если нет, то как бы вы это сделали?

Ответы [ 3 ]

3 голосов
/ 07 мая 2019

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

Например:

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);
}
0 голосов
/ 08 мая 2019

Вы можете вернуть 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;
}
0 голосов
/ 07 мая 2019

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

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

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

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

...