我试图理解函数递归,但我被困在我有一个片段上。我完全理解阶乘示例,您一遍又一遍地调用直到数字匹配 1,但问题是,首先执行什么?foreach 循环还是递归调用?
这是片段:
例如,给定初始字符串"abc",这将是第一次执行foreach循环时的值(permute($str)作为$permutation)?
function permute($str)
{
if (strlen($str) < 2)
{
return array($str);
}
$permutations = array();
$tail = substr($str, 1);
foreach (permute($tail) as $permutation)
{
$length = strlen($permutation);
for ($i = 0; $i <= $length; $i++)
{
$permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
}
}
/* Return the result */
return $permutations;
}
环顾四周,了解如何正确执行递归的一些提示。这个想法是逐步将问题减少到微不足道的情况。不要尝试可视化整个呼叫层次结构。
你似乎不知道如何处理这个问题。实现递归算法的最简单方法通常是使用两个函数:一个递归函数和一个辅助器,该辅助器调用它一次以开始滚球。看看这个:
function permute($string) {
$permutations = array();
permuteHelper('', $string, $permutations);
return $permutations;
}
function permuteHelper($prefix, $string, array &$store) {
$length = strlen($string);
if($length === 0) {
$store[] = $prefix;
}
else {
for($i = 0; $i < $length; $i++) {
permuteHelper($prefix . $string[$i], substr($string, 0, $i) . substr($string, $i + 1), $store);
}
}
}
信用:改编自 Java 中的此实现。
你有一段毫无意义的代码。
函数permute
始终返回一个空数组$permutations
因为函数返回的值自初始化以来从未更改过(从初始值array()
值)。
该函数以交互方式调用自己,将字符串的递减尾部传递给自己,直到尾部仅包含 2 个字符。然后,它以正常和相反的顺序回显这些字符。仅此而已
因此,运行permute('abc')
您只会看到bccb
并接收array()
作为函数结果。
我的变体(也适用于数组或字符串输入)
function permute($arg) {
$array = is_string($arg) ? str_split($arg) : $arg;
if(1 === count($array))
return array(array_shift($array));
$result = array();
foreach($array as $key => $item)
foreach(permute(array_diff_key($array, array($key => $item))) as $p)
$result[] = $item . $p;
return $result;
}