如果我有 3 个字符串,例如:
"abc def xyz"
我想通过重新排列这些字符串来找到我可以生成的最大组合数,例如:
- abc xyz 定义
- 定义 xyz abc
- xyz abc def
等等。计算这个的公式/算法是什么?
如果我有 3 个字符串,例如:
"abc def xyz"
我想通过重新排列这些字符串来找到我可以生成的最大组合数,例如:
等等。计算这个的公式/算法是什么?
这不是组合,而是排列。算法是n! 其中 n 是元素的数量。
为什么 ?
因为您有 3 个值要放置在三个位置,所以第一个位置您有三个选项,第二个只有两个(因为您已经在第一个字符串中放置),最后您只有一个选项。
3 * 2 * 1 = 3!= 6
但是,如果您可以重复这些选择,那么您就可以通过重复进行排列
所以第一名你可以从 3 个字符串中选择,第二个也可以选择一个
3 * 3 * 3 = 3^3 = 27
n^k - 其中 n 是字符串的数量,k - “位置”的数量
代码算法如下所示:
function fact($n)
{
if ($n == 0)
{
return 1;
}
else
{
return $n * fact($n - 1);
}
}
这是一个递归示例
如果我没记错的话是n!组合。
所以 9 你会有
9*8*7*6*5*4*3*2 = 362880 组合
研究排列。O'Reilley 通过 google 提供了一些很好的信息。如果我有一些额外的时间,我会试着为你起草一个例子。
更新
这是一些代码,如果它正常工作,不是 100%,但您应该能够根据您的需要对其进行修改(核心代码来自 O'Reilley 网站,仅供参考):
<?php
function pc_permute($items, $perms = array( )) {
if (empty($items)) {
print join(' ', $perms) . "\n";
} else {
for ($i = count($items) - 1; $i >= 0; --$i) {
$newitems = $items;
$newperms = $perms;
list($foo) = array_splice($newitems, $i, 1);
array_unshift($newperms, $foo);
pc_permute($newitems, $newperms);
}
}
}
pc_permute(array('abc', 'xyz', 'def', 'hij'));
?>
编辑
刚刚看到他想要算法,或者代码应该为其他潜伏者产生结果:) 查看算法的其他答案,即 n!
3*2*1= 6 阶乘!
3 个字符串 = 6 个组合...... 4 个字符串 = 24 个组合......等等