这个递归函数如何 "end" 而不是无限循环(或抛出错误)?
How does this recursive function "end" rather than loop indefinitely (or throw an error)?
我遇到了这个 subset_sum 编码 problem/solution 并试图深入了解它是如何工作的。
快速总结问题:给定一个长度为 n
的数组,找到数组中的最大数,然后找出该数组中是否存在任何数字组合,求和后等于最大数数.
这个问题的设置很简单,但是检查所有数组组合的递归函数的实际功能是我有点困惑的地方。我一直在阅读递归函数并从概念上理解它,但是,我很难理解这个特定程序的确切流程,希望有人可以在这里提供一些帮助。
string flag = "false";
void checkSubsets(int *arr, int i, int length, int *subset, int j, int max) {
if (i == length) {
int index = 0;
int setSum = 0;
while (index<j) {
setSum = setSum + subset[index];
++index;
if (setSum == max) {
flag = "true";
}
}
return;
}
checkSubsets(arr,i+1,length,subset,j, max);
subset[j] = arr[i];
checkSubsets(arr,i+1,length,subset,j+1, max);
}
string ArrayAddition(int arr[], int arrLength) {
int subset[100];
int max = arr[0];
int maxIndex = 0;
for (int i = 0; i<arrLength;i++) {
if (arr[i] > max) {
max = arr[i];
maxIndex = i;
}
}
for (int j = maxIndex; j<arrLength-1;j++) {
arr[j] = arr[j+1];
}
arr[arrLength-1] = 0;
checkSubsets(arr, 0, arrLength, subset, 0, max);
return flag;
}
当i
到达length
时递归结束:
void checkSubsets(int *arr, int i, int length, int *subset, int j, int max) {
if (i == length) {
// stuff
return; // ends here.
}
// else recurse:
checkSubsets(arr,i+1,length,subset,j, max); // i+1
subset[j] = arr[i];
checkSubsets(arr,i+1,length,subset,j+1, max); // i+1
}
对于每次调用,您使用 i+1
调用它,当 i == length
时,它不会更深入地递归,而是 return
.
我遇到了这个 subset_sum 编码 problem/solution 并试图深入了解它是如何工作的。
快速总结问题:给定一个长度为 n
的数组,找到数组中的最大数,然后找出该数组中是否存在任何数字组合,求和后等于最大数数.
这个问题的设置很简单,但是检查所有数组组合的递归函数的实际功能是我有点困惑的地方。我一直在阅读递归函数并从概念上理解它,但是,我很难理解这个特定程序的确切流程,希望有人可以在这里提供一些帮助。
string flag = "false";
void checkSubsets(int *arr, int i, int length, int *subset, int j, int max) {
if (i == length) {
int index = 0;
int setSum = 0;
while (index<j) {
setSum = setSum + subset[index];
++index;
if (setSum == max) {
flag = "true";
}
}
return;
}
checkSubsets(arr,i+1,length,subset,j, max);
subset[j] = arr[i];
checkSubsets(arr,i+1,length,subset,j+1, max);
}
string ArrayAddition(int arr[], int arrLength) {
int subset[100];
int max = arr[0];
int maxIndex = 0;
for (int i = 0; i<arrLength;i++) {
if (arr[i] > max) {
max = arr[i];
maxIndex = i;
}
}
for (int j = maxIndex; j<arrLength-1;j++) {
arr[j] = arr[j+1];
}
arr[arrLength-1] = 0;
checkSubsets(arr, 0, arrLength, subset, 0, max);
return flag;
}
当i
到达length
时递归结束:
void checkSubsets(int *arr, int i, int length, int *subset, int j, int max) {
if (i == length) {
// stuff
return; // ends here.
}
// else recurse:
checkSubsets(arr,i+1,length,subset,j, max); // i+1
subset[j] = arr[i];
checkSubsets(arr,i+1,length,subset,j+1, max); // i+1
}
对于每次调用,您使用 i+1
调用它,当 i == length
时,它不会更深入地递归,而是 return
.