算法之递归

文章来源:http://blog.seclibs.com/算法之递归/算法

递归是一种应用很是普遍的算法,在不少的数据结构和算法的编码中都会用到,理解递归是很是重要的。数据结构

递归在平时的生活中也是很是经常使用的,当你排队的时候须要知道本身排在第几个位置,而前面的人又比较多,你不能本身数出来,就能够询问你前一我的他的位置,在他的位置基础上加一即是你的位置,那若是他也不知道他的位置呢,就能够用一样的方法,继续向前询问,直到第一我的,第一我的就不用往前问了,他直到本身是第一个,这个过程就是一个递归的过程。数据结构和算法

去问的时候叫作“递”,返回来的时候叫作“归”,假设本身是第n排,求本身位置的函数为f(n),f(n-1)就是前一我的的位置,咱们的位置就是f(n-1)+1,一样前一我的的位置也能够用这个公式来计算, 直到第一我的f(1)=1,这一整套流程即是递归的实际利用,编写成代码以下函数

在编写递归代码的时候,有两点必要的条件:编码

  • 一个问题能够分解为多个结构相同,规模不一样的子问题。
  • 存在终止条件。

若是结构不一样,那就不能构造递归了;若是不存在终止条件的话,将会无限循环,看上面的那个例子,它的终止条件就是执行到第一我的的时候,开始日后返回。blog


递归就这样完成了,上面这个例子是只有一个递归调用的分支,仍是比较好理解的,若是有多个递归分支的话,单纯靠人脑是很难理解清楚的,计算机比较适合作重复的工做,咱们若是一环一环往递归里走的话,很快就迷糊了,惟一的方法就是本身屏蔽掉其中细节,只把握好第一个递归公式的构造和终止条件的判断,就能更好的理解清楚递归了。递归

假若有n阶台阶,能够每次走一个台阶或两个台阶,请问走完n阶楼梯有多少种走法?内存

  • 若是有一层台阶,(1),有一种.
  • 若是有两层台阶,(1,1)、(2),有两种
  • 若是有三层台阶,(1,1,1)、(1,2)、(2,1),有三种
  • 若是有四层台阶 ,(1,1,1,1)、(1,1,2)、(1,2,1)、(2,1,1)、(2,2),有五种
  • 若是有五层台阶 ,(1,1,1,1,1)、(1,1,1,2)、(1,1,2,1)、(1,2,1,1)、(2,1,1,1)、(1,2,2)、(2,1,2)、(2,2,1),有八种
  • 以此类推

举几个例子,就能够很明显的发现,从第三层开始,每一层都是前两层的次数相加,因此咱们就能够获得公式f(n) = f(n-1)+f(n-2) ,经过举例子是最容易理解的一个方式,实际上去理解的方法有不少种,能够本身去尝试,你能够用递归的想法去一层层跑一下,就会发现总体的困难程度是很是大的。文档

因此将其转换为代码就以下图所示get


在写递归代码的时候,还须要注意两个问题:

  • 警戒堆栈溢出
  • 警戒重复计算

先说堆栈溢出,在函数调用时,会使用栈来保存临时变量,每进行一次函数调用,就会将临时变量封装后压入内存栈,这个栈的大小是由系统来决定的,若是递归太深,压入栈中的数据是很是多的,就会有堆栈溢出的风险;解决办法就是在递归函数中加入一个判断条件,来判断递归的深度,若是达到了某一个值,就直接返回报错。

另外一个就是重复计算,当咱们在计算f(5)的时候会计算f(4)和f(3),在计算f(4)的时候还须要计算f(3),f(3)就被重复计算了,为了不重复计算,能够经过数据结构来记录已经计算过的值,在计算前先进行判断,若是计算过就直接将值返回。

为了不这些状况,也能够将递归代码改成迭代循环的非递归方式,就是使用循环的方式来进行处理。


参考文档

极客时间-数据结构与算法之美


文章首发公众号和我的博客

公众号:无意的梦呓(wuxinmengyi)

博客:http://blog.seclibs.com/

相关文章
相关标签/搜索