递增函数参数是使用递归更新 "counter" 的好方法吗?

is incrementing a function argument a good way to update a "counter" using recursion?

正在练习递归,一直在看题:

"写一个递归程序,输入数组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 的 occurrences 参数,但用户可以输入他们喜欢的任何整数。我的问题是,这是否被认为是使用递归时保持计数器的好方法,如果不是,那么你会怎么做?

对此的正常解决方案是有一个 non-recursive public 函数,您的用户调用该函数,该函数又调用 递归的私有函数。

例如:

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

我以前见过这种递归方式,看起来不错。

你可以做的是创建一个重载函数,它只使用初始 occurrences 0 调用此函数,如下所示:

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

并将递归函数设为私有。这将避免您担心用户输入任何数字。

您可以 return 从字符串的其余部分得到 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;
}