赞
踩
这篇文章是数据结构专题的第一篇文章,关于数据结构的基本概念,逻辑结构、存储结构、复杂度不再赘述,在《Java SE》专题中的第一篇文章《对编程的认识》中已论述。那么,关于数据结构,为什么一上来就要说递归?因为递归是一种最基本的算法思想之一,还有一种跟它类似的叫迭代,这两种算法思想是最基本的,理解他们有助于理解算法和数据结构。
长久以来,对于递归我都处于一知半解的状态,今天我要彻底拿下它!
为什么理解不了递归?首先第一点,没有理解递归的本质,递归本质上就是函数的嵌套调用啊,你在一个main函数里调用另一个函数,这是不是最正常不过的事?是的,递归也是这样,只不过,一个递归函数它调用的函数不是另一个函数而是它自己,除此以外,它层层嵌套调用它自己直到遇见一个终止条件,然后再逐层返回,这叫递去和归来。
下面我们举一个例子来认识一下递去和归来:
一个连加上连长共101号人,除连长外每个人手上有和自己的编号一样的子弹数量,现连长下命令:从①号开始依次向下一个人报自己的子弹数加上上一个人所报子弹数的和,再将总数依次报回。
先看看递去怎么做?
- int func(int i, int total) {
- if(i > 100) {
- return total;
- }
- total = i + total;
- i++;
- retrun func(i, total);
- }
再看看回来怎么做?
- int func(int i) {
- if(i >= 100) {
- return i;
- }
- retrun i + func(++i);
- }
看到这你可能会发现一个问题,上面提到的这个题目完全可以用迭代去做啊:
- int func(int i, int total) {
- while(i > 100) {
- total = total + i;
- i++;
- }
- retrun total;
- }
确实,这个例子不是特别恰当,但是有些应用场景迭代是解决不了问题的,而往往这样的应用场景使用递归是很恰当的,比如,将一个目录中的所以文件列出来。
另外需要注意:递归的层数不是无限的,这是一个显而易见的问题——
函数调用是在栈中完成的,递归的本质是函数的嵌套调用,栈的大小是有限的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。