在递归调用中使用的向量与数组有何不同?

时间:2015-12-02 10:26:45

标签: c++ arrays recursion vector

我有2个基于this challenge here的非常相似的程序。一个使用数组,一个使用向量。但他们的输出是不同的。即使算法是相同的。请解释一下?

这是代码。 数组版本(输出为2,这是不正确的):

#include <iostream>
#define SIZE 4

int step(int grid[][SIZE], int i, int j)
{
    if (i < 0 || j < 0 || i > 3 || j > 3)
        return 0;
    if (grid[i][j] == 1)
        return 0;
    if ( i == 3 && j == 3)
        return 1;

    grid[i][j] = 1;

    return step(grid, i - 1, j) + step(grid, i + 1, j) + step(grid, i, j - 1) + step(grid, i, j + 1);
}


int main()
{
    int grid[][SIZE] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
    std::cout<<step(grid, 0, 0)<<std::endl;
    return 0;
}

矢量版本(输出184,正确):

#include <iostream>
#include <vector>

#define SIZE 4

int step(std::vector<std::vector<int> > grid, int i, int j)
{
    if (i < 0 || j < 0 || i > 3 || j > 3)
        return 0;
    if (grid[i][j] == 1)
        return 0;
    if ( i == 3 && j == 3)
        return 1;

    grid[i][j] = 1;

    return step(grid, i - 1, j) + step(grid, i + 1, j) + step(grid, i, j - 1) + step(grid, i, j + 1);
}


int main()
{
    std::vector<std::vector<int> > grid;
    std::vector<int> column1(4,0);
    for (int i = 0; i < SIZE; ++i)
        grid.push_back(column1);
    std::cout<<step(grid, 0, 0)<<std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

第一个版本通过引用传递数组 ,因为它等同于将指针传递给数组。第二个版本传递矢量按值,这意味着每个递归调用向量都是在堆栈上创建的,您更改仅本地副本。从函数返回时,此更改会立即消失。

您应该使用以下签名通过引用传递矢量:

int step(std::vector<std::vector<int> >& grid, int i, int j)