【发布时间】:2018-10-18 04:02:32
【问题描述】:
我正在解决一个问题,使用递归打印总和等于给定数字 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);
}
【问题讨论】:
-
您将号码添加到
str,然后将其交给函数。所以第一个调用会是str = "4",然后你将它传递给sums,然后是sum = "43",等等 -
是的,但是 return 语句将我们还原为循环递归调用之前的总和。
-
按照您的期望,正确的输出应该是什么?
-
1 1 1 1 [空格] 2 1 1 [空格] 2 2 [空格] 31 [空格] 4
-
在第一次调用 sums(0,"") 之后,下一个递归调用将是 sums(4, "4") ,它将打印 "4" 而不是 1