Например, учитывая ['a', 'b']
(как генератор) и 2 как длину
функция выведет генератор, который выдаст:
'',
'a',
'b',
'ab'
'ba'
'aa'
'bb'
или учитывая ['a']
и длину 3:
'',
'a',
'aa',
'aaa',
Как вы могли представить, этот набор стал бы намного больше, если бы было добавлено больше букв или увеличилась длина, он должен перечислять все перестановки данных символов вплоть до длины
Вы можете начать с это и изменить функцию sampling
в соответствии с вашими потребностями или использовать ее в другом цикле для другой длины.
Вот довольно очевидное решение.
//Returns all permuations of a certain length.
function perm($ls, $len)
{
if ($len <= 0)
yield '';
else
foreach ($ls as $x)
foreach(perm($ls, $len-1) as $i)
yield $x.$i;
}
//Returns all permuations of all lengths less or equal to the supplied integer.
function all_perm($ls, $len) {
//$ls = iterator_to_array($ls);
for($x=$len; $x>=0; $x--)
foreach(perm($ls, $len-$x) as $string)
yield $string;
}
Просто вызовите all_perm с вашим массивом и максимальной длиной. Если аргумент обязательно должен быть генератором, раскомментируйте $ ls = iterator_to_array ($ ls);.
Вы можете сослаться на то, откуда это у вас?
@Blackbam Я написал это только что.
Хороший. Коротко и эффективно.
Спасибо, мои попытки были далеко не такими элегантными или функциональными.
Отличная идея - использовать генераторы и ключевое слово yield.
Может быть, это может помочь с перестановками, тогда дело просто в длине. Вы пробовали что-нибудь еще, что мы могли увидеть? Это интересная проблема.