线性递归反转数组

Linear Recursion reverse the array

本文关键字:数组 递归 线性      更新时间:2023-10-16

无法弄清楚为什么我的递归函数不起作用?

#include <iostream>
using namespace std;
int ReverseArray(int* A, int i, int j);
int main()
{
int j = 10;
int i = 0;
int *b = new int[j];
for (int i = 0; i <= 10; i++)
b[i] = i;
for (int i = 0; i <= 10; i++) //just to compare the old and new array
cout << b[i] << endl; //just to compare the 
for(int i = 0; i <= j; i++)
cout << ReverseArray(b,i,j) << endl;
system("pause");
return 0;
}
int ReverseArray(int* A, int i, int j)
{
if (i <= j)
{
swap(A[i], A[j]); 
ReverseArray(A, i + 1, j - 1);
}
return A[i];

这应该返回

10,9,8....

但它返回

10,0,9,1...

我不明白为什么会发生这种情况

你有一个双循环,一旦在这里:

for(int i = 0; i <= j; i++)
cout << ReverseArray(b,i,j) << endl;

一旦来到这里:

ReverseArray(A, i + 1, j - 1);

递归调用函数等效于循环遍历它。要反转列表,你只需要循环一次,你所做的相当于一个双重嵌套的循环。所以让我们摆脱

for(int i = 0; i <= j; i++)

和改变

cout << ReverseArray(b,i,j) << endl;

到只是

ReverseArray(b,i,j);

那么你只是在反转 b,没有别的。要打印,只需从 0 循环到 10 并打印每个元素。

此外,不相关,但请记住,您现在拥有的代码涉及尚未分配给堆的内存。

int *b = new int[j];

在物理内存位置 b, b + 1, b + 2, ..., b +9 处创建 j(此处为 10( 整数。b[i] 然后得到保存在 b + i 处的内存,也就是说,它得到 *(b + i(。你的几个循环尝试使用 b[10] 做一些事情,但没有足够的内存分配给它。这将导致未定义的行为(即,根据您的编译器和计算机的状态,可能会发生许多不同的事情(。在我的机器上删除了"system("pause"(;"(这应该不会影响代码执行(,这给了我一个内存分配。

这里的解决方案是要么有

int *b = new int[j+1];

或者将所有 <= 符号替换为 <。