Recursion 递归的优点和缺点是什么?

Recursion 递归的优点和缺点是什么?,recursion,Recursion,关于在排序算法或任何算法中使用递归而不是非递归方法,其优缺点是什么?对于大多数情况,递归速度较慢,并且占用更多的堆栈。递归的主要优点是,对于树遍历这样的问题,它使算法更容易或更“优雅”。 查看一些比较: 我个人更喜欢使用迭代函数而不是递归函数。尤其是当您的函数具有复杂/繁重的逻辑且迭代次数很大时。这是因为每次递归调用堆栈都会增加。如果操作太大,它可能会导致堆栈崩溃,并且会减慢进程。递归意味着函数会重复调用 它使用系统堆栈来完成它的任务。因为堆栈使用后进先出方法 当一个函数被调用时,被控制的被移动

关于在排序算法或任何算法中使用递归而不是非递归方法,其优缺点是什么?

对于大多数情况,递归速度较慢,并且占用更多的堆栈。递归的主要优点是,对于树遍历这样的问题,它使算法更容易或更“优雅”。 查看一些比较:


我个人更喜欢使用迭代函数而不是递归函数。尤其是当您的函数具有复杂/繁重的逻辑且迭代次数很大时。这是因为每次递归调用堆栈都会增加。如果操作太大,它可能会导致堆栈崩溃,并且会减慢进程。

递归意味着函数会重复调用

它使用系统堆栈来完成它的任务。因为堆栈使用后进先出方法 当一个函数被调用时,被控制的被移动到定义函数的地方,该函数被存储在内存中,并带有某个地址,这个地址被存储在堆栈中

其次,它降低了程序的时间复杂度

虽然有点离题,但有点相关。必须阅读:

要开始:

优点:

  • 这是实现可变数量嵌套循环的独特方式(也是实现大量恒定数量嵌套循环的唯一优雅方式)
缺点:

  • 在处理大型集合时,递归方法通常会抛出StackOverflowException。但是递归循环没有这个问题

所有算法都可以递归定义。这使得想象和证明变得越来越容易

某些算法(例如,算法)不能(轻松地)迭代指定


如果无法执行,递归实现将使用比循环更多的内存。虽然迭代可能比无法优化的递归函数使用更少的内存,但它的表达能力有一些限制。

任何使用递归实现的算法也可以使用迭代实现

为什么不使用递归呢
  • 由于维护堆栈的开销,它通常较慢
  • 它通常为堆栈使用更多内存
  • 为什么要使用递归
  • 递归增加了清晰度,并且(有时)减少了编写和调试代码所需的时间(但不一定减少空间需求或执行速度)
  • 降低了时间复杂度
  • 能够更好地解决基于树结构的问题
  • 例如,与迭代相比,使用递归更容易解决河内塔问题。

    表达性 大多数问题自然地用递归表示,如斐波那契、合并排序和快速排序。在这方面,代码是为人编写的,而不是为机器编写的

    不变性 迭代解决方案通常依赖于不同的临时变量,这使得代码难以阅读。这可以通过递归来避免

    演出
    递归不是堆栈友好的。当递归设计不当或尾部优化不受支持时,堆栈可能溢出。

    出现某些情况时,如果递归似乎对您有利,则必须放弃递归,这是因为对于递归必须发生数千次的问题,这将导致stackoverflow错误,即使代码没有陷入无限递归中。大多数编程语言将您限制在多个堆栈调用中,因此如果您的递归超出此限制,那么您可能会考虑不使用递归。

    < P>在以下场景中应该使用递归:

    • 例如,当我们不知道迭代的有限次数时,我们的函数退出条件基于动态规划(记忆)
    • 当我们需要按元素的相反顺序执行操作时。这意味着我们要先处理最后一个元素,然后再处理n-1、n-2等直到第一个元素
    递归将保存多次遍历。如果我们可以像这样划分堆栈分配,它将非常有用:

    int N = 10;
    int output = process(N) + process(N/2);
    public void process(int n) {
        if (n==N/2 + 1 || n==1) {
           return 1;
        }
    
        return process(n-1) + process(n-2);
    }
    

    在这种情况下,在任何给定的时间都只分配半个堆栈。

    递归得到了一个坏名声,我总是惊讶于许多开发人员甚至不接触递归,因为有人告诉他们它是邪恶的化身

    通过反复试验,我了解到,如果操作得当,递归可以是迭代某个对象的最快方法之一,它不是一个稳定的规则,每种语言/编译器/引擎都有自己的怪癖,因此里程数会有所不同

    在javascript中,通过引入递归,我可以可靠地加快几乎任何迭代过程,同时还可以减少副作用,使代码更加清晰、简洁和可重用。另外,专业提示:可以绕过堆栈溢出问题(不,您不会禁用警告)

    我个人的优点和缺点:

    优点:

    缺点:


    里程数因语言/编译器/引擎而异。

    如果您不小心,堆栈溢出一本包含示例、优点的好书。。怀疑…赞成者…反对者…计算堆栈大小…等等:ISBN:978-1-118-80857-3
    - Reduces side effects.
    - Makes code more concise and easier to reason about.
    - Reduces system resource usage and performs better than the traditional for loop.
    
    - Can lead to stack overflow.
    - More complicated to setup than a traditional for loop.