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.