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

标签 c++ recursion

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

相关文章:

c++ - 在 64 位 x 64 位乘法中使用 Karatsuba 算法真的很高效吗?

c++ - 如何增加我的 "for loop"显示的结果?

c++ - 链接错误 - Qt 和 VS2013 上的 Oculus Rift Libs (Linux - Windows)

c++ - 内部类私有(private)成员访问和封闭的友好性

c++ - 如果有人能向我解释这里发生了什么

javascript - 递归打印字符串的所有排列(Javascript)

java - 无限递归错误

java - 递归获取NodeAt java

C 处理大数的阶乘

Haskell 列表中最长的连续元素系列