了解递归解决方案以反向顺序打印出数组

时间:2014-09-04 03:29:08

标签: c++ arrays recursion

我还是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号,然后什么都不做。

那究竟是怎么回事?

4 个答案:

答案 0 :(得分:1)

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

我希望我能说清楚。

答案 1 :(得分:0)

直到大小减小到零,所有函数都会递归调用自身而不打印任何内容,因此堆栈最终得到参数(数组+ 1,大小-1),(数组+ 2,大小-2)和返回地址。一旦大小为零,那么函数返回并打印最后一个字符(数组[size-1]中的那个),然后该实例返回并打印下一个到最后一个字符,依此类推,直到它到达第一个字符调用函数的实例,它打印第一个字符。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

所以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