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