函数参数递增是使用递归更新“计数器”的好方法吗?

时间:2019-05-07 19:57:49

标签: java recursion counter

我正在练习递归,并且一直在研究这个问题:

编写一个递归程序,其输入为数组A和数字x。该程序应在A中打印x出现的次数”

这是我的工作解决方案:

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

如果不引入更多的函数args,我想不出另一种方法。它看起来不太好,因为它取决于将出现次数参数设置为0,但是用户可以输入他们喜欢的任何整数。我的问题是,这是使用递归时保持计数器计数的一种好方法吗?如果没有,那么您将如何做呢?

3 个答案:

答案 0 :(得分:3)

通常的解决方案是拥有一个非递归的 public 函数,您的用户会调用该函数,而该函数又会递归一个 private 函数。

例如:

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

答案 1 :(得分:0)

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

您可以做的是创建一个重载函数,该函数仅以初始occurrences为0来调用此函数,如下所示:

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

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

答案 2 :(得分: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;
}