/// <param name="remain">Оставшаяся часть нашего числа</param>
/// <param name="maxTerm">Максимальный размер слагаемого</param>
/// <param name="terms">Список слагаемых</param>
static void Solve(int remain, int maxTerm, List<int> terms)
{
//Если от числа ничего не осталось, выводим все слагаемые и выходим из функции
if (remain == 0)
{
Console.WriteLine(string.Join(" + ", terms));
return;
}
//Перебираем возможные слагаемые от наибольшего до 1
for (int term = maxTerm; term >= 1; term--)
{
if (term <= remain)
{
terms.Add(term);
Solve(remain - term, term, terms);
terms.Remove(term);
}
}
}
Вызываем метод:
var partitions = new List<int>();
Solve(n, n, partitions); //n - число для которого нужно найти разбиения