将函数参数更改为全局变量会导致意外结果



我正在解决一个回溯问题。我必须构造一个长度为n的排列使每个相邻元素的和都是素数。排列是圆形的,最后一个元素与第一个元素相邻。请注意,所有有效的排列都应该以1开头。

void recurse(int i, int prev, int n, vector<int> prime_ring) {
if (i == n) {
prime_ring.insert(prime_ring.begin(), 1);

if (!is_prime[prime_ring.back() + 1])
return;
for (auto data : prime_ring)
cout << data << " ";
cout << "n";

prime_ring.clear();
return;
}
for (int next = 2; next <= n; next++) {
if (!seen[next] && is_prime[prev + next]) {
prime_ring.push_back(next);
seen[next] = true;
recurse(i + 1, next, n, prime_ring);
seen[next] = false;
prime_ring.pop_back();

}
}
}

上面的代码正确地生成所需的排列。例如n = 4。排列顺序应为

1 2 3 4 
1 4 3 2 

void recurse(int i, int prev, int n) {
if (i == n) {
prime_ring.insert(prime_ring.begin(), 1);

if (!is_prime[prime_ring.back() + 1])
return;
for (auto data : prime_ring)
cout << data << " ";
cout << "n";

prime_ring.clear();
return;
}
for (int next = 2; next <= n; next++) {
if (!seen[next] && is_prime[prev + next]) {
prime_ring.push_back(next);
seen[next] = true;
recurse(i + 1, next, n);
seen[next] = false;
prime_ring.pop_back();

}
}
}

prime_ring更改为全局向量,会导致运行时错误。这个问题发生在我身上很多次,我没有意识到是什么错了。我不知道全局向量和函数参数向量之间的区别。

我不知道全局向量和函数参数向量之间的区别。

不同的是,当您传递vector作为参数时,vector被复制。另一方面,当你使用全局变量时,只有一个"向量"。

这里的解决方案是不使用全局变量,因为你有一个工作函数。

假设您在

recurse(i + 1, next, n);

wherei == n - 1

假设进入recurse函数时,is_prime[prime_ring.back() + 1]true

然后调用prime_ring.clear();,并返回

之后,调用prime_ring.pop_back();

如果你尝试从一个空向量pop_back()会发生什么?好吧,不好的事情可能会发生(即未定义行为)

相关内容

  • 没有找到相关文章

最新更新