java中递归算法的理解
2016-05-20 17:00
405 查看
Coding多了,递归算法是非常常见的,最近我一直在做树形结构的封装,所以更加的离不开递归算法。所以今天就简单说一下这个递归算法,用java实现一个非常经典的递归实例。
递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。这样我们就能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂的问题。
做过树形结构的都知道,我们有时候遇到的树是无限级别的树,这样我们就必须要利用循环和递归算法来实现无限级别的树。
在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。
下面用一个java的实例来实现一下递归算法。
问题描述:
Java代码清单:
[java] view
plain copy
print?
package com.cjq.filedown;
public classFab {
public static void main(String args[]){
System.out.println(fab(5));
}
private static int fab(int index){
if(index==1 || index==2){
return 1;
}else{
return fab(index-1)+fab(index-2);
}
}
}
运行结果:
程序分析:
这个实例是非常经典的实例,主要是利用递归实现了Fibonacci数列。这个递归算法的出口是在
[java] view
plain copy
print?
if(index==1 || index==2){
return 1;
}
这个代码段上,如果程序的index符合条件就会停止进行递归。所以这个程序的运行流程是:
程序分析到这里,递归的实现也就完成了,读者可以自己简单的做个demo,感受一下这个算法的精妙之处,其实很多人都在说算法难,难于上青天,其实掌握算法的根才是最重要的,什么是算法的根呢,就拿这个递归算法来说吧,我感觉这个根就是那个出口,只要找到这个出口所在,那么算法自然而然就能水到渠成了。
递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。这样我们就能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂的问题。
做过树形结构的都知道,我们有时候遇到的树是无限级别的树,这样我们就必须要利用循环和递归算法来实现无限级别的树。
在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。
下面用一个java的实例来实现一下递归算法。
问题描述:
Java代码清单:
[java] view
plain copy
print?
package com.cjq.filedown;
public classFab {
public static void main(String args[]){
System.out.println(fab(5));
}
private static int fab(int index){
if(index==1 || index==2){
return 1;
}else{
return fab(index-1)+fab(index-2);
}
}
}
运行结果:
程序分析:
这个实例是非常经典的实例,主要是利用递归实现了Fibonacci数列。这个递归算法的出口是在
[java] view
plain copy
print?
if(index==1 || index==2){
return 1;
}
这个代码段上,如果程序的index符合条件就会停止进行递归。所以这个程序的运行流程是:
程序分析到这里,递归的实现也就完成了,读者可以自己简单的做个demo,感受一下这个算法的精妙之处,其实很多人都在说算法难,难于上青天,其实掌握算法的根才是最重要的,什么是算法的根呢,就拿这个递归算法来说吧,我感觉这个根就是那个出口,只要找到这个出口所在,那么算法自然而然就能水到渠成了。
相关文章推荐
- java web项目获取服务器IP,匹配一台机器做JOB
- MyElipse6.5环境下java调用vs2010动态链接库DLL人脸检测
- 利用java反射机制调用类的public公有方法的例子
- 【Java】集合遍历增强for和普通for的区别
- java反射机制怎样调用类的私有方法?
- java中String.replaceAll()的使用
- java-RCP
- java.io.Serializable 序列化问题【原】
- JDK Tools - wsimport: 编译 WSDL 生成 JAX-WS 规范的 Java 类
- Java同步之volatile和synchronized的区别
- mybatis集成spring操作数据库(注解方式
- struts2与spring整合问题,访问struts2链接时,spring会负责创建Action
- 在Struts2的Action中取得请求参数值的几种方法
- java项目如何运行
- Java设计模式值简单工厂设计模式
- RocketMQ使用步骤--- 开发测试环境搭建及Java用例
- MyBatis6:MyBatis集成Spring事物管理(下篇)
- JAVA数组的典型操作
- 解决:eclipse 断点调试进入到class文件,无法查看变量值问题
- MyBatis5:MyBatis集成Spring事物管理(上篇)