【问题标题】:Recursion PHP - after one permutation why doesn't this recursive function return a value?递归 PHP - 在一个排列之后,为什么这个递归函数不返回一个值?
【发布时间】:2020-11-18 01:14:27
【问题描述】:
function noOfPermutations($n, $permutation){
    $array = str_split($n);
    if(count($array)==1) {
        echo $permutation."\n";
        return $permutation;
    }else{
        $permutation++;
        noOfPermutations(array_sum($array), $permutation);
    }
}

echo "--".noOfPermutations(91,0)."--\n";

我正在尝试查找 $n 中的数字总和变为单个的排列数。 例如91 -> 9+1 = 10 -> 1+0 = 1。这需要 2 轮,所以会返回 2。 如果 $n 以单个数字开头(它正确返回 0)但不止一个排列并且它只返回 null,则该函数可以正常工作。函数中的第一个echo输出正确的值,但函数外的echo返回null。

【问题讨论】:

  • 我得到了正确的结果。不知道为什么
  • 除非您需要使用递归,否则此类问题可以使用while() 循环轻松解决。
  • 我的代码也得到了正确的结果
  • 很奇怪,我使用的是在线沙箱,所以与实际服务器相比可能会有一些不同。

标签: php recursion


【解决方案1】:

解决方案在你的标题中经过一个排列为什么这个递归函数return没有一个值?

return noOfPermutations(array_sum($array), $permutation);

你也可以看看array_reduce

【讨论】:

    【解决方案2】:

    因为你没有对结果做任何事情。你在 else 中更深入,但对结果不做任何事情。 我猜应该是这样的:

    function noOfPermutations(int $n, int $permutation = 0){
        $array = str_split($n);
        if( count($array) > 1 ) {
            $permutation += noOfPermutations(array_sum($array),  $permutation);
            //  ^^--- Now we actually do something with the result 
        }
    
        return $permutation; 
    }
    

    我还添加了一些代码格式和类型提示


    或者,您可以通过引用创建$permutation,这样您就不必返回它。我不推荐它,但有时它可能是某人的解决方案。

    【讨论】:

      【解决方案3】:

      你没有对返回的值做任何事情,我用这种方式稍微重新阐述了你的函数

      function noOfPermutations($n, $permutation) {
          $array = str_split($n);
          if(count($array)==1) {
              echo "==>" . $permutation."\n";
          }else{
              $permutation++;
              $permutation = noOfPermutations(array_sum($array), $permutation);
          }
          return $permutation;
      }
      
      echo "--".noOfPermutations(91,0)."--\n";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-06
        • 2018-09-03
        • 1970-01-01
        • 2021-07-21
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多