【问题标题】:Head or Tail recursion? Which is preferred way for solving problems requiring recursive structures?头递归还是尾递归?哪种方法是解决需要递归结构的问题的首选方法?
【发布时间】:2015-10-19 05:40:04
【问题描述】:

我正在学习递归,并且正在阅读有关 headtail 递归的信息。被告知头递归首先进行递归调用,然后对结果进行计算。另一方面,尾递归在首先进行递归调用之前完成所有处理。

头递归可以减少传递给递归调用的数据,而尾递归可以导致向递归调用传递额外的数据。

所以,基本上我想知道使用一个比另一个有什么好处?以及如何知道在给定函数中使用了哪一个。

AFAIK 下面的幂函数(为整数定义)正在使用head recursion

def power(num, exponent):
  if exponent <= 1:
    return num
  else:
    return num * power(num, exponent-1)

注意:

我们使用递归的真正原因是为了以一种简单的方式将值存储在“路径”上以供将来使用。递归存储是每个级别的算法状态,并允许用户稍后返回到该确切状态。我们将在使用树遍历例程时看到它的使用。

如果有人能对上述陈述有所了解,那就太好了,因为我认为这对于获得更深入的见解非常重要。

【问题讨论】:

  • What is tail recursion?的可能重复
  • 在 Python 的情况下,尝试尾递归不会有任何好处 b/c 它不支持它,并且根据this SO,它永远不会。
  • @IanMercer 我认为我的问题完全不同,我已经定义了什么是尾递归。我问的是什么时候一个人比另一个人更受欢迎。
  • 关于尾递归的事情是,如果涉及尾调用优化,解释器不会在到达返回行时立即记录算法的状态,并且它不会记录这一点,因为它确实不需要。
  • @IanMercer 我根本不认为这是一个重复的问题。请在标记之前查看问题详细信息,这可能会导致一个可能很好的问题仍未得到解答。

标签: algorithm recursion


【解决方案1】:

有一种叫做尾调用优化的东西,它对函数式编程很重要。我认为对于那个你需要尾递归。但是对于 python 来说,这就像废话。尽管只是为了论证,头递归看起来很可能可以转换为尾递归。

头:

def power(num, exponent):
    if exponent <= 1:
        return num
    else:
        temp = power(num, exponent-1)
    return temp*num

尾巴:

def power(num, exponent,init = 1):
    if exponent <= 1:
        return num*init
    else:
        init = num*init
    return power(num, exponent-1, init)

如果这总是可能的,并且如果解释器足够聪明,那么就优化而言,您执行哪种递归并不重要。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多