了解按相反顺序打印数组的递归解决方案
Understanding a recursive solution to print out an array in reversed order
我对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
- 使用递归的数组的最小值.这是怎么回事
- 数组元素打印的递归方法
- 使用递归模板动态分配的多维数组
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 使用递归输出数组
- 使用递归反转和打印出数组的内容
- 递归二进制搜索与字符串数组
- 将数组传递给递归函数,同时C++修改它
- 使用递归的序列到达数组末尾的最小跳转次数
- 这是定义一组递归规则的正确方法吗?
- 斐波那契数的递归函数
- 尝试递归获取数组元素的总和
- 在C++中对二维数组进行归零.循环需要2个吗
- C++排序数组递归
- 当我的编译器不符合标准时,如何将数组成员归零
- 数独递归,接受零为合法
- 通过除数组递归地计算和
- 动态数组递归与不同的编译器
- 不使用循环和数和的数字根递归