【发布时间】:2021-06-05 18:15:18
【问题描述】:
我正在解决回溯问题。我必须构造一个长度为 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 更改为全局向量会导致运行时错误。这个问题发生在我身上很多次,我没有意识到出了什么问题。我不知道全局向量与函数参数向量之间的区别。
【问题讨论】:
-
每次调用
recurse时,都会创建prime_ring的新副本(按值传递)。对于全局prime_ring,只有一个。所以算法不同。 -
"将 prime_ring 更改为全局向量,会导致运行时错误。"然后不要那样做。您已经有了一个可行的解决方案。
-
prime_ring.clear();为什么找到解决方案后要清除状态? -
@Code-Apprentice 实际上我的第一种方法是全局方法。这就是我问这个问题的原因。
标签: c++ algorithm recursion backtracking