线性递归反转数组
Linear Recursion reverse the array
无法弄清楚为什么我的递归函数不起作用?
#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];
或者将所有 <= 符号替换为 <。
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 数组元素打印的递归方法
- 使用递归模板动态分配的多维数组
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 使用递归输出数组
- 使用递归反转和打印出数组的内容
- 递归二进制搜索与字符串数组
- 将数组传递给递归函数,同时C++修改它
- 使用递归的序列到达数组末尾的最小跳转次数
- 这是定义一组递归规则的正确方法吗?
- 斐波那契数的递归函数
- 尝试递归获取数组元素的总和
- 在C++中对二维数组进行归零.循环需要2个吗
- C++排序数组递归
- 当我的编译器不符合标准时,如何将数组成员归零
- 数独递归,接受零为合法
- 通过除数组递归地计算和
- 动态数组递归与不同的编译器
- 不使用循环和数和的数字根递归