我正在研究一个问题,使用递归方法打印所有等于给定数字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);
}

最佳答案

问题出在您的:for循环内的str+=to_string(i);

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

您可以通过不修改str而是通过调用来解决它sums(sum + i, str + to_string(i));

关于c++ - 递归求和任务的错误答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52866849/

10-10 07:41