递归和迭代的优缺点 什么是单向递归,尾递归?言简意赅即可?
什么是单向递归,尾递归?言简意赅即可?
尾部递归:程序中只有一个递归语句,它位于末尾。单向递归:指程序中的递归语句,在程序运行之前已经完成,如斐波那契数列。这样做的共同特点是在非递归过程中没有必须保存的分支路由
如果递归级别太多,则视为堆栈溢出异常,因为每次调用都会生成一个新的堆栈帧,并使用此堆栈帧保留当前函数的状态值。如果不需要保存状态值,则可以重用堆栈帧而不会导致堆栈溢出。
以n的阶乘为例:
正常递归:
如果n=3,则每一步都需要保留n值和下一个函数的返回值,因此每次调用都需要创建一个新的堆栈帧
尾部递归:
如果n=3,则每次调用都可以重用堆栈帧,因为不需要保存状态值。
因此,当递归在当前堆栈帧执行后完成时,它不需要保留当前堆栈帧,但根据当前堆栈帧的结果,它可以在进入下一个堆栈帧时优化为尾部递归。通常,尾部递归需要满足递归调用是函数体中最后执行的语句。例如,在factorial示例中,要执行的最后一条语句是直接调用factorial(n-1,n*result),而不是表达式n*factorial(n-1)。如果是表达式,则需要堆栈帧来保留N和阶乘(N-1)的结果。
尾递归究竟是好是坏?
1. 递归的基本概念:程序调用本身的编程技巧称为递归。它是函数在其定义中直接或间接调用自身的方法。它通常把一个复杂的大问题转化成一个类似于原问题的小问题,这样可以大大减少代码量。使用递归时要注意两点:1)递归是在一个过程或函数中调用自己。2) 当使用递归时,必须有一个显式的递归结束条件,称为递归退出。递归分为两个阶段:1)递归:将复杂问题的解推到比原问题更简单的问题的解如果递归调用本身,则迭代是一个不停的调用B。递归中必须有迭代,但迭代中可能没有递归,它们中的大多数可以相互转换。那些可以使用迭代的人不需要递归,递归调用函数,浪费空间一个递归必须有一些基准用例,递归调用总是朝着基准的方向前进)〕递归是在运行过程中调用自己。递归的条件如下:
1。子问题应该和原来的问题一样,而且更简单;
递归和迭代有什么区别?
区别和关系:递归是迭代的特例。理论上,任何递归都可以转化为迭代。优缺点及比较:递归性能不如迭代,但递归思想简单明了,有时必须用递归来做,但迭代做不到。例如,在实际开发中,有一个描述实体之间层次关系的表,比如遍历所有实体之间的层次关系,即N:m的关系,它事先不知道每个实体的个数,所以不能通过迭代来实现。我们必须用递归来做深层递归才能得到结果。
如何区别递归和迭代?
Python不会优化尾部递归。默认情况下,递归的最大深度约为1000。当然,可以修改底层的默认最大深度。但是我们可以使用Python内置的yield将尾部递归函数转换为生成器。我只需要连续执行它的下一个方法。这是我自己写的帖子
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。