Function 在开始阶段需要明确递归函数的概念

Function 在开始阶段需要明确递归函数的概念,function,recursion,Function,Recursion,今天我第一次尝试通过在线教程学习递归函数,但仍停留在初级阶段。我找到了下面的代码,但它为我提供了针对任何值的“输出:1”。 因此,我需要更好的解释: function factorial($n){ if($n==0){ return 1; } return fact($n, 1); } function fact($i, $j){ if($i<1){ return 1;} else { return fact($i-1, $i*$j); } } echo factorial(5); 函数

今天我第一次尝试通过在线教程学习递归函数,但仍停留在初级阶段。我找到了下面的代码,但它为我提供了针对任何值的“输出:1”。 因此,我需要更好的解释:

function factorial($n){
if($n==0){
return 1;
}
return fact($n, 1);
}
function fact($i, $j){
if($i<1){
return 1;}
else {
return fact($i-1, $i*$j);
}
}
echo factorial(5);
函数阶乘($n){
如果($n==0){
返回1;
}
返回事实($n,1);
}
函数事实($i,$j){

如果($i这里有一个函数
factorial
,它调用递归函数
fact
。递归函数总是这样工作的:


  • 如果你用一个“琐碎”的参数来调用它,它可以立即给你答案。在你的代码中,这是说
    If($i)的部分,用第9行写这个例子,作为
    return$j;}
    非常感谢你的巨大努力…我也很清楚它的概念。再次感谢
    fact(i, j) = fact(i-1, i*j)
     = fact(i-2, (i-1)*(i*j)) = fact(i-3, (i-2)*(i-1)*i*j)
     = ... = fact(1, (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
     = fact(0, (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
     = (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j # Because 0<1
     = i! * j
    
    function factorial($n){
      if($n==0){ # The trivial case
        return 1;
      }
      # Every other case is "complicated": call a specialized function.
      return fact($n, 1);
    }
    
    function fact($i, $j){
      # Helper function: returns i!*j, doing a recursive calculation.
      if($i<1){ # The trivial case
        return j;  # i!*j for i<1 is just j
      }
      else { # The "complicated" case:
        return fact(
            $i-1,  # Simplify the argument
            $i*$j  # Pass my current state down
          ); # And call myself with the simpler argument and the internal state.
      }
    }
    
    # Test it: This should return 5!=120
    echo factorial(5);