2016 - 2024

感恩一路有你

递归和循环哪个效率高 循环和递归哪个效率高?

浏览量:2442 时间:2021-03-14 19:21:55 作者:admin

循环和递归哪个效率高?

对于已知和可预测的情况,请使用循环而不是递归。例如,如果你使用一个没有任何路径搜索算法的循环,如果你不能走出你的生活,你将需要递归。例如,如果你用递归代替循环,你一定是疯了。好的和坏的算法没有区别。它只取决于您在哪里使用它,以及您是否可以合理地使用它递归在函数体中调用自己。如果不受控制,它将继续调用自身,直到堆栈溢出。循环是区域内一段代码的重复执行,如果不加以控制,就会形成死循环。所以无论是递归还是循环,都必须设置一定的条件来结束递归或循环。在实际问题中,有一些问题是递归的。用递归程序来解决这样的问题会感觉更自然,程序也会更简单。然而,递归经常调用函数,并且开销(内存、时间)很大。有些问题不适合使用。循环不需要自己调用,甚至不能调用函数,效率很高。但是,递归应该改为非递归如果递归级别太多,就会导致堆栈溢出异常,因为每次调用都会生成一个新的堆栈帧,并使用这个堆栈帧来保留当前函数的状态值。如果不需要保存状态值,则可以重用堆栈帧而不会导致堆栈溢出。

以n的阶乘为例:

正常递归:

如果n=3,则每一步都需要保留n值和下一个函数的返回值,因此每次调用都需要创建一个新的堆栈帧

尾部递归:

如果n=3,则每次调用都可以重用堆栈帧,因为不需要保存状态值。

因此,当递归在当前堆栈帧执行后完成时,它不需要保留当前堆栈帧,但根据当前堆栈帧的结果,它可以在进入下一个堆栈帧时优化为尾部递归。通常,尾部递归需要满足递归调用是函数体中最后执行的语句。例如,在factorial示例中,要执行的最后一条语句是直接调用factorial(n-1,n*result),而不是表达式n*factorial(n-1)。如果是表达式,则需要堆栈帧来保留N和阶乘(N-1)的结果。

递归与循环有什么区别?

递归和迭代都是循环类型。简单地说,递归就是反复调用函数本身来实现循环。迭代是由函数中的某些代码实现的循环。迭代与普通循环的区别在于,循环代码中参与运算的变量也是保存结果的变量,当前保存的结果是下一次循环计算的初始值。在递归循环中,当满足终止条件时,循环将逐层返回。迭代使用计数器结束循环。当然,在许多情况下,各种循环是混合的,这取决于具体的需要。递归示例,例如,给定一个整数数组,使用半查询返回数组中指定值的索引,假设数组已排序。为了便于描述,假设所有的元素都是正数,数组的长度是2的整数倍。半查询是一种查询,它比遍历所有元素快得多。Int find(Int*ari,Int index,Int len,Int value){if(len==1)//最后一个元素{if(ari[index]==value)return index//查询返回索引return-1//查询失败,返回-1}//如果长度大于1,执行半递归查询int half=len/2//检查检查值是否大于上半部分的最后一个值。如果是,则递归查询第二部分If(value>ary[index half-1])return find(ary,index half,half,value)//否则递归查询上部分return find(ary,index,half,value)}迭代。经典的例子是实数的累加,例如计算从1到100的所有实数之和。int v=1for(i=2i<=100i){v=vi}

递归和循环通常可以相互转换,但递归往往思路清晰,算法简单,写代码效率高,但循环不便于理解,但它的执行效率很高

因为程序在调用函数时需要保护场景,即留下一个标志,以确保函数在调用后能正确返回到主函数。循环不存在这个问题。

谭浩强的C语言书中说,河内塔问题只能通过递归来解决,不能通过其他方法来解决。这句话似乎有问题。很多人提出了一种非递归的解决汉诺塔问题的方法

但是可以尽可能的使用循环,这样程序可以运行更多的时间和内存空间

递归和循环哪个效率高 递归效率与循环效率 举例说明递归和迭代的区别

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。