首页 > 解决方案 > 在修改 C++ 时将数组传递给递归函数

问题描述

我有一个递归函数,它将二维数组作为 C++ 中的参数。这个二维数组的内容在这个函数的所有递归调用中是唯一的。

我想在每次进行递归调用之前修改这个数组。如何在不修改两个递归调用的数组的情况下执行此操作,仅针对当前调用?

这是我想要完成的事情:

void foo(int a[10][10]) {
  // imagine base case above
  // modify array, i.e. set a[2][2] to '5'
  foo(a);
  // modify array i.e. set a[2][2] to '3'
  foo(a);
}

我尝试了以下方法,导致编译器错误:

void foo(int a[10][10]) {
  // imagine base case above
  foo(a[2][2] = 5);
  foo(a[2][2] = 3);
}

这个想法是我希望数组在递归调用中是独立的,例如,我不希望该集合a[2][2] = 5应用于下一个递归调用。从某种意义上说,我希望在应用下一个修改(更改)之前“还原”该数组修改。

int如果我只是将 an作为参数传递,这很容易实现。例如,我可以这样做:

void foo(int a) {
  // imagine base case above
  // increase a by 1
  foo(a + 1);
  // decrease a by 4
  foo(a - 4);
}

您可以在这里看到在不影响以下递归调用的情况下进行修改是多么容易。

我的问题是如何使用array进行相同的更改。

标签: c++arraysfunctionc++11recursion

解决方案


C-array 不能被复制,std::array可以:) 所以我会使用std::array.

a[2][2] = 5改变数组,而i - 4不会改变整数i(因此在这种情况下没有什么可丢弃的,与 相反f(i -= 4))。

数组上没有允许轻松定制的运算符,我们可以为此创建函数或 lambda:

// pass by value
std::array<std::array<int, 10>, 10>
mutated(std::array<std::array<int, 10>, 10> a, int x, int y, int value)
{
    a[x][y] = value;
    return a;
}

void foo(const std::array<std::array<int, 10>, 10>& a) {
  // imagine base case above
  // "modify" array, i.e. set a[2][2] to '5'
  foo(mutated(a, 2, 2, 5));
  // "modify" array i.e. set a[2][2] to '3'
  foo(mutated(a, 2, 2, 3));
}

推荐阅读