2016-08-22 33 views
3

的整數,我想找到用C和Haskell 一個Composition of Integer我找到的Haskell這個代碼工作正常:此代碼的組成C和哈斯克爾

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創建遞歸函數,但我不知道如何使用哈斯克爾的等效:[]用C

0此代碼的

樣本輸出是:

Composition is 
111 

2 

21 

3 

3正確的組合物是

1 1 1 
2 1 
1 2 
3 
+0

你的問題有點混亂。你到底在問什麼? C或C#解決方案?你能描述一下那些不認識Haskell的人:表達式:'生成n = [x:rest | x < - [1..n],rest < - generate(n-x)]'呢?你提供的信息越多越容易讓人們回答你的問題 –

+0

@LuckAss我添加C輸出 –

+0

@progy_rock 1)我知道但我不知道如何解決它2)我沒有開發它呢,無論如何,我也不知道如何以遞歸方式創建數組,例如我在Haskel中使用:冒號。 –

回答

1

用printf不是真正等效的:它把結果輸出,而不是到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,我的意思是僞代碼:) –