我正在练习递归,并且一直在研究这个问题:
“ 编写一个递归程序,其输入为数组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,但是用户可以输入他们喜欢的任何整数。我的问题是,这是使用递归时保持计数器计数的一种好方法吗?如果没有,那么您将如何做呢?
答案 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;
}