1

関数の再帰を理解しようとしていますが、私が持っているスニペットに行き詰まっています。番号が1に一致するまで何度も呼び出す階乗の例を完全に理解していますが、ここで問題は、最初に実行されるのは何ですか? foreach ループですか、それとも再帰呼び出しですか?

スニペットは次のとおりです。

たとえば、 foreach ループが呼び出されたときに初めて実行される値となる初期文字列 'abc' が与えられた場合 ( permute($str) as $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;
}
4

2 に答える 2

0

あなたは一種の無意味なコードを持っています。

関数が返す値は初期化以降 (初期値から) 変更されていないpermuteため、関数は常に空の配列を返します。$permutationsarray()

関数呼び出し自体は、末尾が 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;
}
于 2013-09-17T14:06:41.600 に答える