任务是编写一个C ++递归函数,它接收一个整数并打印所有分区。 (重要的是订购)
示例:
n = 1唯一的排列是{1}
n = 2,排列为{1,1},{2}
n = 3,排列为{1,1,1},{1,2},{2,1},{3}
n = 4,排列为{1,1,1,1},{1,1,2},{1,2,1},{1,3},{2,1,1},{ 2,2},{3,1},{4}
请注意订单的重要性,例如对于n = 3,{1,2}和{2,1}都是不同且有效的答案。
这是我的解决方案,其中包含一个我很难追踪的错误:
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
using namespace std;
stringstream g_ss_str("");
void printSums(int n){
static stack<string> strings;
if (n==0){
cout<<g_ss_str.str()<<endl;
return;
}
for (int i=1; i<=n; ++i){
g_ss_str<<i<<" ";
strings.push(g_ss_str.str());
printSums(n-i);
if (!strings.empty()) {
g_ss_str.str(strings.top());
strings.pop();
}
}
}
问题从n = 3开始,在这种情况下,我得到的输出是:
1 1 1
2 1
2 1
3
而不是:
1 1 1
1 2
2 1
3
感谢您的帮助!
答案 0 :(得分:3)
您正在使用stringstream
和stack
玩一些不必要的复杂游戏。试试something like this:
void printSumsHelper(int n, const string& prefix) {
if (n==0){
cout << prefix << endl;
return;
}
for (int i=1; i<=n; ++i) {
ostringstream ss;
ss << prefix << i << ' ';
printSumsHelper(n - i, ss.str());
}
}
void printSums(int n){
printSumsHelper(n, "");
}