递归算法

来源:互联网 发布:seo技术 编辑:程序博客网 时间:2024/05/21 08:52

递归

(最近看排序算法:归并排序、快速排序,都是递归形式的编程,自己对递归不是很熟,用网上的资料学习一下)

程序调用自身的编程技巧称为递归( recursion),是一种编程策略,带着 “如何将问题规模缩少”的思想 比 “将大问题分解为一个个小问题” 的思想要更好地编写递归程序。

(中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过这样的波浪式前进方法,最终达到目的地。当然整个过程需要很多往返,这样的前进方式,效率比较低下。撞南墙、Robin的解释地道,和我英雄所见略同)

设计递归算法

1.确定递归公式

2.明确的递归结束条件(递归出口)

解决问题的步骤:

  1. 了解问题是否能用递归来解决
  2. 确定递归的结束条件
  3. 确定递归的执行部分

处理递归问题,常用if语句来判断是否符合递归结束的条件,其算法形式如下:

4.  if (符合递归的结束条件)

5.  {

6.      return结果}

7.  else

8.  {

9.      使用递归将程序分解成更简单的小程序

10. }

例子

1)斐波纳契数列(Fibonacci Sequence)( http://blog.csdn.net/agileclipse/article/details/8551228 )


2)N皇后问题

 

3)汉诺塔问题

 

总结

递归算法对解决一大类问题很有效,在复杂算法的描述中被经常采用,它可以使算法简洁和易于理解。但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。

(一旦你理解了递归,阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果你的每个步骤正确无误,你的限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能正确的完成任务。真的吗?)

关键在于自己理清思路,尝试手工画一画每层函数调用时的局部变量的值,画一画递归的过程图

 

0 0
原创粉丝点击