for 循环中的递归跟踪


Recursion tracing within for loop

我试图理解函数递归,但我被困在我有一个片段上。我完全理解阶乘示例,您一遍又一遍地调用直到数字匹配 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;
}