怎么判断一个问题是不是递归的

来源:互联网 发布:mac pro能玩什么游戏 编辑:程序博客网 时间:2024/05/17 07:24
 

递归,怎么理解这个概念?我们不需要用复杂的语言来描述这个概念,只需要从这个词的本意入手即可。递归的英文也就是recursion,这个词的词源是recur,我们都知道occur的意思是发生,那么recur的意思也就不难理解了,也就是重复发生。所以说,递归,就是指一个事情周期性重复发生,也就是说,在一个算法里,如果一个方法被重复调用,那么这个方法就有可能是递归的。

 

那么怎么判断一个问题是否能用递归的方法来解?这可以从三方面去考虑。

 

1.       这个问题的定义是不是递归的?

比较典型的就是Fibonacci数列和阶乘问题,这两个问题本身都包含了递归的过程,因此很容易判断出可以用递归法去解。

 

2.       数据本身是不是递归的?

这类情况中,比较典型的是链表和二叉树。判断一个数据是不是递归结构,关键点在于局部数据和全局数据的结构是不是一样的,拿单向链表来说,每一个节点都有一个数据,一个指向它的指针和一个指向下一个节点的指针,而整个链表也是这种结构,因此链表是递归结构。而对于二叉树则是一个道理,二叉树的任意一棵子树都和它本身具备相同的结构。因此,操作这类数据都可以选择递归。

 

3.       问题的解法是不是递归的?

这种情况稍难判断一点,需要程序员在自己的脑中模拟一下问题的解决过程,从而找出递归关系。最经典的例子莫过于汉诺塔,在移动盘子的过程中,每一次移动底层盘子,都需要把上层的盘子移开,而每次移动的方法又都是相同的,因此是比较典型的递归问题。

 

在各种算法教材上几乎都把递归作为第一个介绍的算法,但是个人认为递归其实并不是那么好理解,想正确的判断出递归,并且应用递归,是需要大量练习的。