此函数将乘积为数字k
的数组中的所有三元组打印出来
输入元素的第一行数,第二个数组元素,第三个目标乘积..将参数传递给递归函数f
以及一个 vector ,该 vector 存储其乘积可能为k
的元素
思维过程->对于每个元素,我们可以包括或排除它以获得产品k
。如果p > 24
或数字元素相乘> 3
,我们将回溯。一旦输入了prod = k
,我们将打印 vector v
中的所有数字并将其弹出,并将元素数量设置为0
并将乘积设置为1
并继续
输入以下内容:
9
1 2 3 12 4 7 5 24 9
24
我的输出看起来像这样:
12
2
1
9
9
9
| ->cursor justs stops here ..no further outputs...
使用的命名方案:
计数->到目前为止乘以的元素数,其乘积存储在-> p
n->数组中的元素数
k->目标pdt
i->当前数组中元素的索引
代码:
#include <iostream>
#include <vector>
using namespace std;
// all triplets whose product is a number k
void f(int i, int count, int p, int k, vector<int>&v, int *a, int n)
{
// success condition
if(count == 3 && p == k)
{
for(int i = 2; i >= 0; --i)
{
cout << v[i] << " " << endl;
v.pop_back();
}
p = 1;
count = 0;
}
if(count>=3 || i > n - 1 || p > k)
{
return;
}
v.push_back(a[i]);
f(i + 1, count + 1, p * a[i], k, v, a, n);
v.pop_back();
f(i + 1, count, p, k, v, a, n);
}
int main()
{
int n;
cin >> n;
int *a=new int[n];
for(int i = 0; i < n; ++i)
{
cin >> a[i];
}
int k;
cin >> k;
//int p = 1;
vector<int>v;
f(0, 0, 1, k, v, a, n);
delete[] a;
return 0;
}
最佳答案
您对p
和count
的“重置”在成功时立即很奇怪:为什么该函数需要继续查看其调用者何时已尝试其他可能性?但这只是对实际问题的干扰:第一个递归调用周围的平衡push_back
和pop_back
建立并依赖于不变,其中每个调用都使v
的长度与开始时的长度相同。但是成功路径会清除vector
并将其保留的较短,因此最终pop_back
为空时,并且-
除了不确定的行为(在这里碰巧会产生无限循环)的乐趣外,解决方法很简单:仅在打印后返回,而无需完全修改 v
。 (然后,您可能会发现进一步的简化。)
关于c++ - 谁能在我的递归函数中查明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632205/