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 - Perl

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sub divide {
  my ($n,$m) = @_;
  return [[$n]] if $m == 1;
  my @list;
  for(my $k=$n;$k>=0;$k--){
    push @list, map {[$k,@{$_}]} @{divide($n-$k,$m-1)};
  }
  return [@list];
}

map {print join ",", @{$_},"\n";} @{divide(5,3)}

非常に安直

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!perl

use strict;
use warnings;

output(@ARGV);

sub output {
  my ($n, $m, @result) = @_;

  if ($m == 1) {
    print join(", ", @result, $n), "\n";
    return;
  }

  for my $i (reverse 0..$n) {
    push @result, $i;
    output($n - $i, $m - 1, @result);
    pop @result;
  }
}

Index

Feed

Other

Link

Pathtraq

loading...