【问题标题】:How does this recursive function "end" rather than loop indefinitely (or throw an error)?这个递归函数如何“结束”而不是无限循环(或抛出错误)?
【发布时间】:2021-02-28 01:57:18
【问题描述】:

我遇到了这个 subset_sum 编码问题/解决方案,并试图深入了解它是如何工作的。

快速总结问题:给定一个长度为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; 
}

【问题讨论】:

  • 这是不是比排序快,然后从两端遍历?
  • 每次调用 checkSubsets 都会导致另外 2 次调用。一个有第 i 个项目,一个没有第 i 个项目。

标签: c++ subset-sum


【解决方案1】:

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

【讨论】:

  • 那么,递归调用 checkSubsets 是否只是为了构建“子集”数组,然后在 i == length 时遍历该数组,然后检查是否有任何组合满足子集和问题的要求?这很有意义,我很感谢您的快速回答。
  • @Lennac 我没有分析算法在做什么。我不知道。我正在向你展示它为什么会终止
  • 很公平。感谢您的回复。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多