Почему Perl в Math :: Combinatorics жалуется на то, что «должен использовать next_permutation аргумента« частоты », не переданного конструктору»? - PullRequest
2 голосов
/ 18 сентября 2010

Я пытаюсь сгенерировать уникальные перестановки массива, используя Math :: Combinatorics.Как говорит CPAN-страница , это можно сделать с помощью next_string ():

use Math::Combinatorics;
my @arr = [1,1,1,0,0];  
$c = Math::Combinatorics->new( count=>5, data=>[\@arr], frequency=>[3,2] );
while (@permu = $c->next_string()){
print "@permu\n";
}  

Однако этот код выдает мне следующую ошибку: должен использовать next_permutation, если аргумент частоты не переданв конструктор и я не могу понять, почему.

Ответы [ 2 ]

6 голосов
/ 18 сентября 2010

У вас много проблем в этой программе.В ваших типах данных есть несоответствие.

Если вы хотите использовать frequency, вы указываете уникальные элементы только один раз, но указываете, сколько раз они появляются.Ссылка на массив, который вы указываете для частоты, должна быть той же длины, что и массив данных:

use Math::Combinatorics;

my @array = (1,0); # an array, not an array reference

$c = Math::Combinatorics->new( 
    count     => 5,
    data      => \@array,        # now you take a reference    
    frequency => [3,2] 
    );

while (@permu = $c->next_string ){
    print "@permu\n";
    }

Теперь вы должны получить желаемый вывод, представляющий собой различные комбинации, в которых вы не можете определить разницу междукратные 1 и множественные 0:

0 1 1 1 0
0 1 1 0 1
0 1 0 1 1
0 0 1 1 1
1 0 1 1 0
1 0 1 0 1
1 0 0 1 1
1 1 0 1 0
1 1 0 0 1
1 1 1 0 0

Если вы не используете frequency, вам просто нужно указать все элементы в массиве данных.Тем не менее, вы, вероятно, избегаете этого, поскольку он рассматривает каждый элемент как отдельный, чтобы не сворачивать то, что выглядит как одна и та же комбинация.

1 голос
/ 18 сентября 2010

Хотя я не использовал этот пакет документация говорит, что частота должна быть такой же длины, что и аргумент конструктора данных.

В вашем примере длины не совпадают, поэтому могут бытьэто проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...