我还是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号,然后什么都不做。
那究竟是怎么回事?
答案 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