我正在寻找可以帮助我遍历并使用递归显示2d数组或矩阵的人。
void display(int** matrix1,int row, int column)
这就是我为一维数组所做的事情:
void print_array(int arr[], int size, int i)
{
if (i == size) {
cout << endl;
return;
}
cout << arr[i] << " ";
print_array(arr, size, i+1);
}
我知道如何遍历一维数组,但无法执行此操作。我想使用递归显示矩阵中的每个元素。
我确定您需要编写C程序或C ++程序,但由于声明了int **
之类的“ 2D数组”,因此需要使用C的功能。:]
如果再使用一个辅助递归函数,则该函数很容易实现。
这里是示范节目
#include <stdio.h>
void display_row( int *a, size_t column )
{
column == 0 ? ( void )putchar( '\n' )
: ( void )( printf( "%2d ", *a ), display_row ( ++a, --column ) );
}
void display( int **a, size_t row, size_t column )
{
if ( row != 0 )
{
display_row( *a, column );
display( ++a, --row, column );
}
}
int main(void)
{
enum { M = 3, N = 4 };
int a1[N] = { 1, 2, 3, 4 };
int a2[N] = { 5, 6, 7, 8 };
int a3[N] = { 9, 10, 11, 12 };
int *a[M] = { a1, a2, a3 };
display( a, M, N );
return 0;
}
程序输出为
1 2 3 4
5 6 7 8
9 10 11 12
如果不使用辅助函数,那么另一种方法是在递归函数内部使用静态变量。
首先,不清楚为什么要递归解决方案。也许这只是个小问题,但我发现递归难以编写,读取和调试。无论如何,我允许自己修改您的1d版本:
#include <iostream>
#include <vector>
void print_array(const std::vector<int>& arr,size_t i = 0) {
if (i == arr.size()) {
std::cout << '\n';
return;
}
std::cout << arr[i] << " ";
print_array(arr, i+1);
}
我使用size_t
而不是int
,因为那是与容器大小进行比较时要使用的类型。我为i
提供了一个默认值,因为当您调用它时,您不想传递索引,而只是打印整个数组。 std::endl
不仅在打印新行,而且还刷新流。在大多数情况下,这是不必要的。
对于2D情况,您需要添加的只是第二个索引和要转到下一行的条件。
即,如果函数的签名为
void print_array(const std::vector<std::vector<int>>& arr,size_t i=0,size_t j=0)
并且它打印arr[i][j]
,那么当i == arr.size()
时,您需要返回而不打印任何内容,而当j== arr[i].size()
时,您必须跳至下一行。您需要符合以下条件的条件:
if (j == arr[i].size()) {
std::cout << '\n';
print_array( arr, i+1,0); // start with the first element of next row
return;
}
PS是您坚持使用int**
,它应该很容易适应,但是如果内部数组的大小都相同,我强烈建议使用vector
甚至是std::vector<std::array>
。