如何使用递归遍历二维数组

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;
    }