challenge 自然数の分割

自然数nとm(n>=m>0)が与えられたとき,nをm個の非負の整数の和で表すやり方を全て出力してください.
その際,和の組(x_1, ..., x_m)は大きい順に出力してください.
ここでm = 3の時の「(a, b, c)が(A, B, C)より大きい」とは
(a > A)
(a == A) かつ (b > B)
(a == A) かつ (b == B) かつ (c > C)
のいずれかが成り立つとき(つまりは辞書的順序)とします.

例:n = 5, m = 3が与えられたときは
5, 0, 0,
4, 1, 0,
4, 0, 1,
3, 2, 0,
3, 1, 1,
...
0, 1, 4,
0, 0, 5,
を出力する.

Posted feedbacks - xtal

1
2
3
4
5
6
(|n, m|{
  if(m <= 1) return [[n]];
  r: [];
  (n + 1).times{|x| callee(x, m - 1){ r.push_back([n - x] ~ it); } }
  return r;
})(5, 3){ it.p; }

fiber を使って書き換えてみる。
1
2
3
4
5
6
(|n, m|{ c: callee; m--;
  return fiber{
    if(m < 1) yield [n];
    else (n + 1).times{|x| c(x, m){ yield [n - x] ~ it; } }
  }
})(5, 3).join("\n").p;

Index

Feed

Other

Link

Pathtraq

loading...