Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线性递归反转数组_C++ - Fatal编程技术网

C++ 线性递归反转数组

C++ 线性递归反转数组,c++,C++,不明白我的递归函数为什么不工作 #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;

不明白我的递归函数为什么不工作

#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];
#包括
使用名称空间std;
int ReverseArray(int*A,int i,int j);
int main()
{
int j=10;
int i=0;
int*b=新的int[j];

对于(int i=0;i你有一个双循环,一旦在这里:

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++)
那么你只需要反转b,没有别的。要打印,只需从0循环到10,然后打印每个元素

同样,这是不相关的,但请记住,现在的代码涉及尚未分配给堆的内存

int *b = new int[j];
在物理内存位置b,b+1,b+2,…,b+9处创建j(这里是10)int。b[i]然后获取在b+i处保留的内存,也就是说,它获取*(b+i)。您的几个循环尝试使用b[10]执行操作,但没有为其分配足够的内存。这将导致未定义的行为(也就是说,根据编译器和计算机的状态,可能会发生许多不同的事情)。在我的计算机上删除“system”(“pause”);(不应影响代码执行)后,这给了我一个内存分配

这里的解决方案是要么

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

或者替换所有供参考的内容,您可以只使用数组基数和长度,使用指针算法并在递归调用中降低长度。或者,使用将是最简单的方法,但我怀疑这对您的赋值是否是合法的解决方案。
int *b = new int[j];
int *b = new int[j+1];