構成

2016-08-22 19 views
3

私は正常に動作Haskellのため、このコードを見つけCとHaskellの でComposition of Integer見つけたい:このコードの構成

composition 0 = [[]] 
composition n = [x:rest | x <- [1..n], rest <- composition (n-x)] 

サンプル出力は、次のとおりです。

*Main> composition 3 
[[1,1,1],[1,2],[2,1],[3]] 

*Main> composition 4 
[[1,1,1,1],[1,1,2],[1,2,1],[1,3],[2,1,1],[2,2],[3,1],[4]] 

しかし、私はCで同等のものを開発できませんでした: Cで再帰関数を作成しようとしましたが、Haskellと同等のものを使う方法がわかりません:[] in C

0このコードの

サンプル出力は次のとおりです。

Composition is 
111 

2 

21 

3 

3の正しい組成物は、printf関数を使用して

1 1 1 
2 1 
1 2 
3 
+0

あなたの質問はちょっと混乱しています。あなたは正確に何を求めているのですか? CまたはC#ソリューション?あなたはハスケルを知らない人々のために、次のような表現を記述できますか? 'generate n = [x:rest | x < - [1..n]、rest < - generate(n-x)] 'は実行しますか?より多くの情報を提供することで、人々があなたの質問に答えることが容易になります –

+0

@ LuckAss私はC出力を追加します –

+0

@progy_rock 1)私は知っていますが、私はそれを修正する方法を知らない2)とにかく私はまた、私がハスケルで行ったような再帰的な方法で配列を作成する方法を知らない:コロン。 –

答えて

1

は本当に同等ではありません:それはそれをリストとして返すのではなく、stdoutに結果を出力しますオブジェクト。 C++ですることができます

std::vector<std::vector<int> > composition(int n) 
{ 
    int j; 
    if (n == 0) 
     return std::vector<std::vector<int> >(0); 
    std::vector<std::vector<int> > ret; 
    ret.push_back(std::vector<int>(1, n)); 
    for (j = 1; j <= n; j++) 
    { 
     std::vector<std::vector<int> > rec = composition(n - j); 
     for (auto& it : rec) 
      it.push_back(j); 
     ret.insert(ret.begin(), rec.begin(), rec.end()); 
    } 
    return ret; 
} 

本当に平野Cが必要な場合は、自分でベクトルを動的に割り当てる必要があります。それはあまり面白くない。

+0

何かリストを画面に表示したくない場合は、次のようなsudoコードを使ってください:foreach y in composition(nj){printf(j、y)} yはおそらくリストです –

+0

リストを最初に計算してからそれを印刷する。 –

+0

TY、擬似コードを意味する:) –