递增函数参数是使用递归更新 "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;
}
正在练习递归,一直在看题:
"写一个递归程序,输入数组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;
}