递归的实际用途

时间:2016-02-08 18:07:53

标签: recursion

是否有时候使用递归代替任何其他方法更好?通过递归,我指的是:

int factorial(int value)
{
  if (value == 0)
  {
    return 1;
  } else
  {
    return value * factorial(value - 1);
  }
}

2 个答案:

答案 0 :(得分:3)

嗯,我可以想到几个原因。

  • 递归通常比纯粹的迭代解决方案更容易理解。例如,在recursive-descent parsers

  • 的情况下
  • 在支持tail call optimization的编译器中,在迭代中使用递归没有额外的开销,并且它通常会导致更少的代码行(因此,更少的错误)

答案 1 :(得分:1)

首先,你的例子没有任何意义。 你编写它的方式只会导致无限循环而没有任何结果。

“真实”功能更像是这样:

int factorial(int value)
{
    if (value == 0)
      return 1;
    else
      return value * factorial(value - 1);
}

当然你可以用循环完成同样的事情(甚至可能更好,特别是如果函数调用会导致堆栈帧的惩罚)。通常,当人们使用递归时,他们会这样做,因为它更容易阅读(对于某些问题域)。