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

时间:2012-11-21 11:48:49

标签: 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);

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

  

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

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

1 个答案:

答案 0 :(得分: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

现在,如果您只想要阶乘,则需要使用fact作为第二个参数调用1,就像在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);