数据结构 No.6 java递归的简单应用
2018-02-05 11:03
381 查看
定义
语言例子
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’”
正式定义
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。
某人祖先的双亲同样是某人的祖先(递归步骤)。
代码示例
下面的代码一共两个方法,展现了递归最基础的应用,第一个test方法,调用此方法执行打印操作,然后在调用此方法。第二个test2方法,输入目标值,然后打印此值,然后将比目标数小一个的数字传入方法中,调用,在打印,在调用,在打印。public class Recursion { public static void main(String[] args) { test2(100); } /** * 演示方法 死循环,抛异常 */ public static void test() { System.out.println("Hello,World!"); test(); } /** * 打印从1到目标数字 */ public static void test2(int n) { if(n == 0) { return; } System.out.println(n); test2(n - 1); } }这个演示的为一个基本的三角数列,就是A,B,A+B,B+A+B....
/** * 三角数列 * @project JavaData * @date 2018年2月5日 上午10:43:06 * @author Huaxu-Charles */ public class Triangle { public static int getNumber(int n) { int total= 0; while(n > 0) { total = total + n; n--; } return total; } public static int getNumberByRecursion(int n) { if(n == 1) { return 1; } else { return n + getNumberByRecursion(n - 1); } } }
斐波那契数列是典型的递归案例:
{\displaystyle F_{0}=0}
(初始值)
{\displaystyle F_{1}=1}
(初始值)
对所有大于1的整数n:{\displaystyle F_{n}=F_{n-1}+F_{n-2}}
(递归定义)
/** * 斐波那契数列 * @project JavaData * @date 2018年2月5日 上午10:59:56 * @author Huaxu-Charles */ public class Fibonacci { public static int getNumber(int n) { if(n == 1) { return 0; } else if(n == 2){ return 1; } else { return getNumber(n - 1) + getNumber(n - 2); } } }
小结:个人感觉递归的东西用语言描述起来反而比较抽象和繁琐,可能自己本身了解的还不够深,语言功底不够,所以话少,代码比较多。还有就是在编写递归调用的函数的时候,一定要把对简单情境的判断写在最前面,以保证函数调用在检查到简单情境的时候能够及时地中止递归,否则,你的函数可能会永不停息的在那里递归调用了。下一期会演示经典递归汉诺塔问题的分析
相关文章推荐
- 数据结构-Java实现-简单递归
- Java数据结构-线性表之栈的应用-递归及其应用
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
- 【算法数据结构Java实现】递归的简单剖析及时间复杂度计算
- 把一个java web应用包装成桌面应用的简单做法
- JAVA中日志-log4j简单应用
- JAVA 应用简单破解---类库提前加载
- java图像界面开发简单实例-JPanel应用
- JAVA 应用简单破解---类库提前加载
- java(j2ee)应用-简单自定义标签开发全过程----之一(Inber)——JAVA夜未眠
- java图像界面开发简单实例-JButton及事件的简单应用
- java图像界面开发简单实例-Graphics2D、Rectangle2D、Ellipse2D、Line2D的简单应用
- Java数据结构学习之应用场合
- Java中Regex简单应用
- java图像界面开发简单实例-JCheckBox、JLabel的应用
- 转:把一个java web应用包装成桌面应用的简单做法(个人比较喜欢,想有空研究一下,特意转载,以备后用)
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- 递归在java语言中的应用
- JAVA中的递归方法应用
- java图像界面开发简单实例-JTextArea、JScrollPane、JPanel、JButton应用实例