2016 - 2024

感恩一路有你

递归啥意思 如何对递归进行理解?

浏览量:1333 时间:2021-03-22 07:32:55 作者:admin

如何对递归进行理解?

既然你想用简单的白话来解释递归算法,我就给你解释一下,确保你能理解。

有个熟悉的故事,正好可以解释递归。

这个故事不断地调用自己,递归是一个函数多次调用自己。不同的是递归不能像这个故事那样多次调用自己。递归必须有终止条件,它将在多次调用后终止。

这个解释很口语化。递归在函数体中调用自己。如果不受控制,它将继续调用自身,直到堆栈溢出。循环是区域内一段代码的重复执行,如果不加以控制,就会形成死循环。所以无论是递归还是循环,都必须设置一定的条件来结束递归或循环。在实际问题中,有一些问题是递归的。用递归程序来解决这样的问题会感觉更自然,程序也会更简单。然而,递归经常调用函数,并且开销(内存、时间)很大。有些问题不适合使用。循环不需要自己调用,甚至不能调用函数,效率很高。但是,递归应该改为非递归如果递归级别太多,就会导致堆栈溢出异常,因为每次调用都会生成一个新的堆栈帧,并使用这个堆栈帧来保留当前函数的状态值。如果不需要保存状态值,则可以重用堆栈帧而不会导致堆栈溢出。

以n的阶乘为例:

正常递归:

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

尾部递归:

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

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

递归啥意思 递归算法经典实例 苹果助手

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