递归求和任务的错误答案

时间:2018-10-18 04:02:33

标签: c++ recursion sequence

我正在研究一个问题,使用递归方法打印所有等于给定数字n的非递增子序列。我知道我的递归算法有问题,但是我已经多次遍历了该过程,但找不到错误。输入4,我的代码给出输出:

4 431 4322 432211 43213 4321321 43213212 4321321211 我相信递归可以保留以前的数字或过去递归调用中使用的总和,但是找不到原因。有人可以帮我弄清楚为什么程序没有给出正确的输出吗?

#include <iostream>
#include <string>

using namespace std;

int n;

void sums(int sum, string str)
{
  if (sum==n)
  {
    cout << str << "\n";
    return;
  }
  for (int i = n-sum; i >= 1; i--)
  {
    str+=to_string(i);
    sums(sum+i, str);
  }
}

int main()
{
  cin >> n;
  string s = "";
  sums(0, s);
}

2 个答案:

答案 0 :(得分:0)

问题出在您的{:{1}} for循环内。

在第一次调用时,总和为0,str =“”,在for循环中,它从i = 4开始,i--。但是在主体内部,您附加到str + = 4并调用sums(4,“ 4”),并且错误发生在下一个循环i-- str + =“ 3”并变为“ 43”和sums(3, “ 43”);

您可以通过不修改str而是调用它来修复它 str+=to_string(i);

答案 1 :(得分:0)

根据我对递归函数的理解,我认为根本不应该存在循环!因此,替换:

for (int i = n-sum; i >= 1; i--)
{
  str+=to_string(i);
  sums(sum+i, str);
}

作者:

str+=to_string(n-sum);
sums(n-sum, str);