大家好,关于递归的那些事很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于递归有什么用的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
本文目录
递归最简单的解释
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
1.子问题须与原始问题为同样的事,且更为简单;
2.不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
Python递归函数到底是什么原理
首先,递归不是python独有的,递归是一种算法,简单地说,就是一个函数不停地调用自己,直至达到停止条件。
构成递归需具备两个条件:
子问题须与原始问题为同样的事,且更为简单;不能无限制地调用本身,须有个出口(即要有个边界),化简为非递归状况处理其中递归又分为直接递归和间接递归。递归又分为两情况,分别为直接递归和间接递归。
直接递归是在A函数中嵌套使用A函数,然后有一个停止该函数的条件。间接递归是在A函数中调用B函数,然后在B函数中调用A函数,即间接调用自己实现递归。这里我用著名的斐波那契数列(即从第3项起,后一个数为前两项之和)做演示:
运行得出第10项结果为34,结果正确。现在我们来分析其运行过程中,为方便理解,我们计算第5项,运行过程我们用如下图表示:
从图中我们可以看出,所谓递归,就是把大的事件,逐步细化分别进行处理,这就是分治的思想。
那么递归是在计算机中怎样实现的呢?如果我们有了解过数据结构这门课程,我们就会知道,这就是用栈来实现的。
还有一点值得注意的,我们看上图是不是有些相同的部分重复调用了,所以说使用递归会使程序变得相对慢一些,在日常开发中,我们是比较少用的,虽然递归的代码块看起来比较简洁。
消除递归一般要用到什么数据结构
消除递归一般要用到栈这种数据结构。递归函数的执行过程可以看作是一系列函数调用的嵌套,每次调用函数都会在内存中分配一段空间来保存函数的本地变量和返回地址。当函数执行完成后,这段空间会被释放掉。但是如果递归的调用层数太多,会导致内存空间的消耗过大,甚至会导致栈溢出的错误。
因此,我们可以使用栈来模拟递归函数的执行过程。每次调用函数时,将函数的参数以及返回地址入栈;当函数执行完成后,从栈中取出返回地址并跳转到该地址继续执行。这样就可以将递归转化为循环来执行,从而避免了递归带来的消耗和风险。
尾递归究竟是好是坏
无论什么递归,在实际工作都不建议使用。但是递归这种思想,在数据结构与算法相关的课程中还是很重要的,尤其是可以优化这个思想,解决一些迭代问题。
普通递归大多数人了解普通递归,都是在计算机相关专业经典本科书籍谭浩强的《C语言程序设计》中,但是求n!阶乘其实用递归是不明智的,因为除了速度慢,使用递归还无法预测计算过程中内存的使用情况,如果发生了OOM就会影响整个项目。
递归的百度百科解释是程序调用自身的编程技巧,也就是说在程序中调用了自己,如下图,可以看到在shi_er这个函数中,又调用shi_er自身,从而达到了十进制转换二进制的目的。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,构成递归需具备的条件:
1.子问题须与原始问题为同样的事,且更为简单;
2.不能无限制地调用本身,须有个出口,化简为非递归状况处理。
但是,如果没有满足上述条件,又轻易调用递归,就会有无限死循环的风险,这也是我么在实际工作中不推荐使用递归的的原因。
尾递归从上面的代码我们可以看到,普通递归是从初始状态开始计算,而尾递归是从最后开始计算,函数调用是出现在函数的尾部,直接让被调用的函数返回时越过调用者,返回到调用者的调用者去。尾递归是极其重要的,因为用尾递归的话,可以避免对函数对堆栈和内存的无法估计的消耗,无须保存中间函数的堆栈。
再举一个用尾递归实现斐波那契数列的例子
intFibonacciTailRecursive(intn,intret1,intret2)
{
if(n==0)
returnret1;
returnFibonacciTailRecursive(n-1,ret2,ret1+ret2);
}
综上,尾递归能够比普通递归更加安全,但是总的来说,基于我的经验,实际工作中并不推荐使用递归。如果能够对你有所帮助,欢迎点赞留言。
我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎关注我,与我共同进步。
关于递归的那些事和递归有什么用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。