【发布时间】:2019-05-19 01:08:30
【问题描述】:
例如给定['a', 'b'](作为生成器)和 2 作为长度
该函数将输出一个生成器,该生成器将产生:
'',
'a',
'b',
'ab'
'ba'
'aa'
'bb'
或给定['a'],长度为3:
'',
'a',
'aa',
'aaa',
您可以想象,如果添加更多字母或增加长度,这个集合会变得更大,它应该列出给定字符的所有排列,直到长度
【问题讨论】:
例如给定['a', 'b'](作为生成器)和 2 作为长度
该函数将输出一个生成器,该生成器将产生:
'',
'a',
'b',
'ab'
'ba'
'aa'
'bb'
或给定['a'],长度为3:
'',
'a',
'aa',
'aaa',
您可以想象,如果添加更多字母或增加长度,这个集合会变得更大,它应该列出给定字符的所有排列,直到长度
【问题讨论】:
这是一个相当不言自明的解决方案。
//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);.
【讨论】: