0

今天我第一次尝试通过在线教程学习递归函数,但停留在开始阶段。我找到了下面的代码,但它为我提供了针对任何值的“输出: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);

还有一件事,我需要澄清以下返回方法:

返回事实($i-1, $i*$j);

将工作从两个参数传达单个值。any1 请给我一些关于这个问题的想法,以澄清我的概念。提前谢谢..

4

1 回答 1

1

这里有一个factorial调用递归函数的函数fact。递归函数总是这样工作:

  • 如果你用“微不足道”的论点来称呼它,它可以立即给你答案。在您的代码中,这就是说的部分if($i<1){ return $j; }(根据@Sreenath 的评论)

  • 如果参数更“复杂”,则该函数会简化参数($i-1在您的示例中:平凡的情况是$i<1,因此$i在某种程度上使参数变小会使参数更容易),然后使用更简单的参数和可能的一些附加信息调用自身,这是fact($i-1, $i*$j)呼叫的来源。

所以fact这里的递归函数可以做以下事情:

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

现在如果你只想要阶乘,你需要调用factwith1作为第二个参数,就像你在return fact($n, 1);.

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);
于 2012-11-21T12:09:07.273 回答