gpt4 book ai didi

c++ - 谁能在我的递归函数中查明错误?

转载 作者:行者123 更新时间:2023-12-02 10:22:07 24 4
gpt4 key购买 nike

此函数将乘积为数字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;

}

最佳答案

您对pcount的“重置”在成功时立即很奇怪:为什么该函数需要继续查看其调用者何时已尝试其他可能性?但这只是对实际问题的干扰:第一个递归调用周围的平衡push_backpop_back建立并依赖于不变,其中每个调用都使v的长度与开始时的长度相同。但是成功路径会清除vector并将其保留的较短,因此最终pop_back为空时,并且-

除了不确定的行为(在这里碰巧会产生无限循环)的乐趣外,解决方法很简单:仅在打印后返回,而无需完全修改 v。 (然后,您可能会发现进一步的简化。)

关于c++ - 谁能在我的递归函数中查明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com