【问题标题】:What are the advantages of recursion compared to regular loops? [duplicate]与常规循环相比,递归的优点是什么? [复制]
【发布时间】:2016-02-18 21:09:04
【问题描述】:

我在上一个问题中遇到了这段代码:

a = 1

def func1():
    if a == 1:
        func2()

def func2():
    if a == 1:
        func3()

def func3():
    func1()

有没有时候使用这样的递归比常规循环更有益?如果是,应该在什么时候使用,约定是什么?

【问题讨论】:

  • 这不是真正的recursion,并且这个问题中没有任何内容表明任何类型的“循环”。这个例子简单地划分了命名函数中的一些逻辑控制流语句。这样做的目的通常是为了可读性和易于维护(即,如果底层逻辑发生变化,通过减少代码中需要修改的行数)
  • @DavidZemens 这个例子是相互递归的,所以它代表了一个无限循环。

标签: python recursion theory


【解决方案1】:

递归调用和循环有很多用途:

当你使用递归时:

  • 都是相当简单的逻辑调用方法
  • 取决于你在递归中的深度,你会遇到内存问题
  • 它们最适合用于树函数或方法

当你使用循环时

  • 逻辑清晰,但有时不像递归调用那样简单
  • 您可以更好地控制内存使用,而不是递归方法或函数
  • 它们用于迭代列表项。

【讨论】:

【解决方案2】:

两者各有优缺点,主要取决于编程语言。

在硬件层面,递归是有代价的,每次调用函数时,底层机制必须存储一个指针,指向函数完成后程序必须跳转到的代码位置。除此之外,它还必须存储函数参数和局部变量。这一切都存储在程序堆栈中。

然而,一些问题在使用递归时有一个更自然的解决方案,例如tower of hanoi

可读性也是一个重要的考虑因素,老实说,我相信您的示例可以从循环中受益。

here 中给出了迭代和递归之间的广泛比较。 总结了优缺点。

【讨论】:

  • 尾递归解决了“存储一个指针,指向函数完成后程序必须在代码中跳转的位置。”。这样堆栈就不会增长。任何不在当前函数范围内的资源都会被释放。
  • 我同意存在解决递归缺点的方法。就像我说的,这取决于编程语言,尤其是其结构的底层实现。我只是想概述一下处理递归的传统方式。尾递归并非总是可行的,并且并非在所有语言中都实现。不过谢谢你指出来。
猜你喜欢
  • 2019-06-02
  • 2019-07-17
  • 2020-12-24
  • 2013-07-20
  • 2011-01-25
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多