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

问题描述 投票:-2回答:2

我正在寻找可以帮助我遍历并使用递归显示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 arrays function recursion definition
2个回答
0
投票

我确定您需要编写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 

如果不使用辅助函数,那么另一种方法是在递归函数内部使用静态变量。


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不仅在打印新行,而且还刷新流。在大多数情况下,这是不必要的。

对于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>

© www.soinside.com 2019 - 2024. All rights reserved.