【问题标题】:How is this line returning the length of the array in recursion?这行如何递归返回数组的长度?
【发布时间】:2017-03-26 07:37:53
【问题描述】:

我正在尝试使用调试器来理解这个递归,并试图逐步理解它。调试器显示smallAns返回数组的大小我不明白这个smallAns是如何返回大小的数组input[].谁能解释一下这个

 #include<iostream>
    using namespace std;
    int subsequences(char input[], int startIndex,char output[][50]){
          if(input[startIndex] == '\0'){
            output[0][0] = '\0';
            return 1;
          }
          int smallAns = subsequences(input, startIndex+1, output);
          for(int i = smallAns; i < 2*smallAns; i++){
            int row = i - smallAns;
            output[i][0] = input[startIndex];
            int j = 0;
            for(; output[row][j] != '\0'; j++){
                output[i][j + 1] = output[row][j];
            }
            output[i][j + 1] = '\0';
          }
          return 2*smallAns;
        }
        int main(){

      char input[] = "abc";
      char output[100][50];
      int ans = subsequences(input, 0, output);
      for(int i = 0; i < ans; i++){
        for(int j = 0; output[i][j] != '\0'; j++){
          cout << output[i][j];
        }
        cout << endl;
      }
    }

【问题讨论】:

  • @ruakh 编辑了代码
  • 请在投反对票前提出宝贵的建议
  • smallAns 是输入长度的 2 次方。我不知道为什么你的调试器说的不一样;我猜你要么在设置变量之前查看变量(所以你看到垃圾),要么你没有使output 足够大(所以你正在粉碎堆栈然后看到垃圾)。
  • @ruakh snallAns 在这里返回数组的长度,我将输入作为mickymouse 然后返回10,我也尝试了其他字符串,它给出了字符串的长度。

标签: c++ arrays algorithm recursion array-algorithms


【解决方案1】:

这是算法的作用:

从末尾开始,带有空子序列(或“\0”)。您有 1 个子序列。

查看尚未考虑的最后一个字符。对于您找到的所有子序列,您可以添加最后一个字符,也可以不添加。因此,您将子序列的数量增加了一倍。

重复。

因此,2 * smallAns 的意思是“将在较低递归调用中找到的子序列数加倍。”在您知道它是如何实现的之后,这才有意义。因此 cmets 和文档在代码中的重要性。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2012-04-24
    • 2021-11-20
    • 1970-01-01
    • 2022-07-12
    • 2014-06-16
    • 2016-01-25
    相关资源
    最近更新 更多