我试图了解函数递归,但我已经陷入了我所拥有的片段。我完全理解你一遍又一遍地调用的阶乘示例,直到数字匹配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;
}
答案 0 :(得分:0)
你有一种毫无意义的代码。
函数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;
}
答案 1 :(得分:0)
查看有关如何正确进行递归的一些提示。这个想法是逐步将问题减少到微不足道的情况。不要试图可视化整个调用层次结构。
您似乎不知道如何解决问题。实现递归算法的最简单方法通常是使用两个函数:一个递归和一个调用它一次启动滚动的辅助函数。看看这个:
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中的this implementation。