【问题标题】:Understanding a recursive solution to print out an array in reversed order了解以相反顺序打印出数组的递归解决方案
【发布时间】:2014-10-28 16:36:35
【问题描述】:

我还是 C++ 新手,目前正在学习递归。我想以相反的顺序显示元素,而不使用递归在末尾开始数组的索引。

显然使用循环很容易,但使用递归是另一回事。我在网上找到了这个问题的解决方案,但无法理解它究竟是如何打印出每个值的。

void recArrayBackPrint(int array[],int size)
{
   if (size > 0)
   {
      recArrayBackPrint(array+1,size-1);
      cout << array[0] << "   ";
   }
//  base case is empty array (size == 0), so do nothing
}

我知道在这种情况下,数组 + 1 将指代位于当前元素 + 1 处的内存地址。在尝试使用以下内容对其进行跟踪后:

int main() {
    int values[5] = {1,2,3,4,5}
    recArrayBackPrint(values,5);
}

我可以一直到大小为 0,但仍然不知道它如何能够打印出数组 [4]、数组 [3] 等。在我看来,它应该是点击 recArrayBackPrint一直到大小为 0,然后什么都不做。

那么这里到底发生了什么?

【问题讨论】:

    标签: c++ arrays recursion


    【解决方案1】:

    第一次在recArrayBackPrint,它打印{1,2,3,4,5}的第一个元素,然后是1。
    但在输出之前,它进入第二个recArrayBackPrint 打印 {2,3,4,5} 的第一个元素,然后是 2.
    仍然,在输出 2 之前,第三个 recArrayBackPrint 在 {3,4,5} 中打印 3。
    一直到最后一个 recArrayBackPrint 以在 {5} 中打印 5。 那么输出顺序是:
    第五名recArrayBackPrint (5)
    第四名recArrayBackPrint (4)
    第三recArrayBackPrint (3)
    第二个recArrayBackPrint (2)
    第一个recArrayBackPrint (1)

    我希望我说清楚。

    【讨论】:

      【解决方案2】:

      在大小减小到零之前,函数所做的只是递归调用自身而不打印任何内容,因此堆栈以参数 (array+1, size-1)、(array+2, size-2) 和返回地址。一旦大小为零,则函数返回并打印最后一个字符(数组 [size-1] 处的那个),然后该实例返回并打印倒数第二个字符,依此类推,直到它到达第一个在打印第一个字符的地方调用的函数的实例。

      【讨论】:

        【解决方案3】:

        假设recArrayBackPrintTMP 是一个也打印数组的函数。当它在打印剩余数组后返回时,您的recArrayBackPrint 将打印第一个元素,而不是什么都不做

        void recArrayBackPrint(int array[],int size)
        {
           if (size > 0)
           {
              recArrayBackPrintTMP(array+1,size-1);
              cout << array[0] << "   ";
           }
        //  base case is empty array (size == 0), so do nothing
        }
        

        接下来假设recArrayBackPrintTMP 相似,但又称为recArrayBackPrintTMP2,它将所有元素 2 向后打印。

        void recArrayBackPrintTMP(int array[],int size)
        {
           if (size > 0)
           {
              recArrayBackPrintTMP2(array+1,size-1);
              cout << array[0] << "   ";
           }
        //  base case is empty array (size == 0), so do nothing
        }
        

        现在假设我们只是在进行递归时重用相同的函数,而不是编写所有这些相似的函数。

        【讨论】:

          【解决方案4】:

          所以伪代码大概是这样的:

          To print out an array of N values backwards:
              Print out the last (N-1) backwards
              Print out the first one.
          

          所以:

          To print out the numbers from 1-5 backwards:
            print 2-5 backwards; to do this:
               print 3-5 backwards; to do this:
                 print 4-5 backwards; to do this:
                   print 5 backwards; to do this:
                     print nothing backwards; to do this:
                       do nothing
                   print 5
                 print 4
                print 3
              print 2
            print 1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-14
            • 2021-10-24
            • 2011-07-20
            • 1970-01-01
            • 2011-12-08
            • 2013-07-22
            • 1970-01-01
            相关资源
            最近更新 更多