3

可能的重复:
显示字符串
算法的可能组合,该算法将采用数字或单词并找到所有可能的组合

如果我有 3 个字符串,例如:

"abc def xyz"

我想通过重新排列这些字符串来找到我可以生成的最大组合数,例如:

  • abc xyz 定义
  • 定义 xyz abc
  • xyz abc def

等等。计算这个的公式/算法是什么?

4

4 回答 4

8

这不是组合,而是排列。算法是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);
  }
}

这是一个递归示例

于 2010-08-06T17:06:54.043 回答
1

如果我没记错的话是n!组合。

所以 9 你会有

9*8*7*6*5*4*3*2 = 362880 组合

于 2010-08-06T17:04:04.893 回答
0

研究排列。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!

于 2010-08-06T17:01:30.157 回答
0

3*2*1= 6 阶乘!

3 个字符串 = 6 个组合...... 4 个字符串 = 24 个组合......等等

于 2010-08-06T17:10:08.827 回答