如何使用递归遍历二维数组
How to traverse a 2D array using recursion
我正在找人帮助我使用递归遍历和显示二维数组或矩阵。
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);
}
我知道如何遍历一维数组,但不会这样做。
我想使用递归显示矩阵中的每个元素。
首先,不太清楚为什么要递归解决方案。也许这是一个简单的问题,但我发现递归很难编写、阅读和调试。无论如何,我允许自己修改你的 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
不仅打印新行,而且还刷新流。在大多数情况下这是不必要的。
对于二维情况,您需要添加的只是第二个索引和转到下一行的条件。
也就是说,如果函数的签名是
void print_array(const std::vector<std::vector<int>>& arr,size_t i=0,size_t j=0)
并打印 arr[i][j]
然后你需要在 i == arr.size()
时不打印任何内容 return 并且在 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>
。
我确定您需要编写 C 程序或 C++ 程序,但由于您声明了“2D 数组”,例如 int **
.:)
,所以使用了 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
如果不使用辅助函数,则另一种方法是在递归函数中使用静态变量。
这是一个使用带有静态变量的递归函数的演示程序。
#include <stdio.h>
void display( int** a, size_t row, size_t column )
{
static size_t pos = 0;
if ( row != 0 && column == 0 )
{
putchar( '\n' );
size_t tmp = column;
column = pos;
pos = tmp;
--row;
++a;
}
if ( row )
{
printf( "%2d ", a[0][pos++] );
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;
}
其输出与上图相同
如果您需要 C++ 程序,那么只需包含 headers
#include <iostream>
#include <iomanip>
而不是例如 printf
的调用
printf( "%2d ", a[0][pos++] );
使用
std::cout << std::setw( 2 ) << a[0][pos++];
这里有一个简单的递归解法希望你能看懂......
#include <iostream>
using namespace std;
void print(int x,int y,int arr[3][3])
{
cout<<arr[x][y]<<" ";
if(x==2 && y==2)//Its a 3 by 3 matrix.....Index starts from 0 and ends at 2 for both row and colomn.
{
return;
}
else if(y==2)
{
cout<<endl;
print(x+1,0,arr);
}
else
print(x,y+1,arr);
}
int main()
{
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
print(0,0,arr);
return 0;
}
我正在找人帮助我使用递归遍历和显示二维数组或矩阵。
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);
}
我知道如何遍历一维数组,但不会这样做。 我想使用递归显示矩阵中的每个元素。
首先,不太清楚为什么要递归解决方案。也许这是一个简单的问题,但我发现递归很难编写、阅读和调试。无论如何,我允许自己修改你的 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
不仅打印新行,而且还刷新流。在大多数情况下这是不必要的。
对于二维情况,您需要添加的只是第二个索引和转到下一行的条件。
也就是说,如果函数的签名是
void print_array(const std::vector<std::vector<int>>& arr,size_t i=0,size_t j=0)
并打印 arr[i][j]
然后你需要在 i == arr.size()
时不打印任何内容 return 并且在 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>
。
我确定您需要编写 C 程序或 C++ 程序,但由于您声明了“2D 数组”,例如 int **
.:)
如果再使用一个辅助递归函数就可以很容易的实现这个功能
这是一个演示程序
#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
如果不使用辅助函数,则另一种方法是在递归函数中使用静态变量。
这是一个使用带有静态变量的递归函数的演示程序。
#include <stdio.h>
void display( int** a, size_t row, size_t column )
{
static size_t pos = 0;
if ( row != 0 && column == 0 )
{
putchar( '\n' );
size_t tmp = column;
column = pos;
pos = tmp;
--row;
++a;
}
if ( row )
{
printf( "%2d ", a[0][pos++] );
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;
}
其输出与上图相同
如果您需要 C++ 程序,那么只需包含 headers
#include <iostream>
#include <iomanip>
而不是例如 printf
的调用printf( "%2d ", a[0][pos++] );
使用
std::cout << std::setw( 2 ) << a[0][pos++];
这里有一个简单的递归解法希望你能看懂......
#include <iostream>
using namespace std;
void print(int x,int y,int arr[3][3])
{
cout<<arr[x][y]<<" ";
if(x==2 && y==2)//Its a 3 by 3 matrix.....Index starts from 0 and ends at 2 for both row and colomn.
{
return;
}
else if(y==2)
{
cout<<endl;
print(x+1,0,arr);
}
else
print(x,y+1,arr);
}
int main()
{
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
print(0,0,arr);
return 0;
}