【问题标题】:Recursion tracing within for loopfor循环内的递归跟踪
【发布时间】:2013-09-17 23:29:01
【问题描述】:

我试图理解函数递归,但我被困在我拥有的 sn-p 上。我完全理解阶乘示例,您一遍又一遍地调用直到数字匹配 1 但这里的问题是,首先执行什么? foreach 循环还是递归调用?

这里是sn-p:

例如,给定初始字符串 'abc',这将是调用 foreach 循环时第一次执行的值( 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;
}

【问题讨论】:

    标签: php recursion


    【解决方案1】:

    四处寻找有关如何正确执行递归的提示。这个想法是逐步将问题减少到微不足道的情况。不要试图可视化整个调用层次结构。

    你似乎不知道如何解决这个问题。实现递归算法的最简单方法通常是使用两个函数:一个递归函数和一个调用它一次以开始滚动的助手。看看这个:

    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。

    【讨论】:

      【解决方案2】:

      你有一段无意义的代码。

      函数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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2015-07-14
        • 2013-12-19
        • 2016-04-13
        相关资源
        最近更新 更多