打印给定数字的所有分区

时间:2014-11-29 00:43:43

标签: c++ algorithm sum

任务是编写一个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

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您正在使用stringstreamstack玩一些不必要的复杂游戏。试试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, "");
}