了解按相反顺序打印数组的递归解决方案

Understanding a recursive solution to print out an array in reversed order

本文关键字:数组 递归 解决方案 打印 顺序 了解      更新时间:2023-10-16

我对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的大小,但仍然不知道如何打印出array[4]、array[3]。。等等。在我看来,它应该是点击recArrayBackPrint,一直到0号,然后什么都不做。

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

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

我希望我能说清楚。

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

假设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
}

现在假设我们在执行递归时只是重复使用同一个函数,而不是编写所有类似的函数。

所以psuedocode大约是这样的:

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