for循环中的递归跟踪

时间:2013-09-17 13:43:12

标签: php recursion

我试图了解函数递归,但我已经陷入了我所拥有的片段。我完全理解你一遍又一遍地调用的阶乘示例,直到数字匹配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;
}

2 个答案:

答案 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