2016-08-22 3 views
3

Я хочу найти в C и Haskell в Composition of Integer я нахожу этот код для Haskell, который работает отлично:состав целого числа в C и Haskell

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: [] в C

void composition(int n) 
{ 
     int j; 
     if (n==0) 
       return; 
     for(j=1;j<=n;j++){ 
       printf ("%d",j); 
       composition(n-j); 
       printf("\n"); 
     } 

} 

образец Выход этого кода:

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 не очень эквивалентны: он выводит результат на стандартный вывод вместо того, чтобы вернуться в список объект. В 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 в композиции (nj) {printf (j, y)}, который, вероятно, является списком –

+0

Сначала вычислите список, затем распечатайте его. –

+0

TY, кстати, я имею в виду псевдокод :) –

Смежные вопросы