【问题标题】:Is this program tail recursive?这个程序是尾递归的吗?
【发布时间】:2013-05-19 23:56:33
【问题描述】:

我和我的朋友争论我们必须为作业分析的算法是否是尾递归的,但他坚持认为是。所以,算法看起来像这样:

SomeAlgo(x)
{
   x--;

   if (x > 1)
   {
      SomeAlgo(x);
   }
   else
   {
      return x;
   }
}

我告诉他这不是尾递归,因为 SomeAlgo(x) 不是要执行的最后一条语句。我们需要一个基本案例,但我们不需要。如果我们有一个基本案例,基本案例中的代码将是第一个被执行的事情,而对自身的调用(返回要返回的值)将是最后一个。

如果它不是尾递归的,你能告诉我需要做什么才能使它成为尾递归吗?

【问题讨论】:

  • 这是什么编程语言?如果您在标签中指定您使用的编程语言,您将获得更多视图。

标签: recursion language-agnostic


【解决方案1】:

SomeAlgo(x) 要执行的最后一条语句,如果 X 大于 1。

【讨论】:

  • 我认为你需要有 return algo(x) 才能有一个尾递归算法。最后执行的语句是 return x 而不是 algo(x)。我错了吗?
  • 如果算法使用尾递归的唯一可能方式是返回另一个对自身的调用,那么“尾递归”的每个实现都会导致无限递归,从而导致 stackoverflowerror,因为它会永远无法返回静态值。对于您的算法,return x; 其中 x
  • 否则 return x 是基本情况,对吧?但这不是执行的第一条语句,而是执行的最后一行代码,对吧?
  • 当x
  • 这并不完全是一个错误的定义。但必须有一个终止条件,即基本情况,否则递归将永远持续下去,永远不会真正返回任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多