Java递归实现简单算法

简介: Java递归实现简单算法: 斐波那契数列、求阶乘、列出某个目录下所有子目录和文件、汉诺塔问题、二分法查找

1.斐波那契数列

package algorithm;
public class Algorithm_1 {
    public static void main(String[] args) {
        System.out.println(getNum(5));
    }
    /**
     * 用递归实现斐波那契数列,适用于求解比较小的位置数值
     * 0 1 1 2 3 5 8 13 21...
     * @param n
     * @return
     */
    public static int getNum(int n){
        if(n <= 2){
            return 1;
        }else {
            return getNum(n-1) + getNum(n-2);
        }
    }
}

2.求阶乘

package algorithm;
public class Algorithm_2 {
    public static void main(String[] args) {
        System.out.print(getNum(5));
    }
    /**
     * 求阶乘
     * n!=n*(n-1)*(n-2)*...*1
     * @param n
     * @return
     */
    public static int getNum(int n){
        if(n == 1){
            System.out.print(n + "=");
            return 1;
        }else {
            System.out.print(n + "*");
            return getNum(n-1) * n;
        }
    }
}

3.列出某个目录下所有子目录和文件

package algorithm;
import java.io.File;
public class Algorithm_3 {
    public static void main(String[] args) throws Exception {
        getDir("F:\\Java\\jdk\\db");
    }
    /**
     * 列出某个目录下所有子目录和文件
     * @param path
     * @return
     */
    public static void getDir(String path) throws Exception {
        File file = new File(path);
        if(file.isDirectory()){
            System.out.println("Dir" + file.getPath());
            File[] fileArr = file.listFiles();
            for (File f : fileArr) {
                getDir(f.getPath());
            }
        }else if (file.isFile()){
            System.out.println("File" + file.getPath());
        }else {
            throw new Exception(file.getPath() + "非Dir非File?!");
        }
    }
}

4.汉诺塔问题

package algorithm;
public class Algorithm_4 {
    private final static String from = "柱子A";
    private final static String mid = "柱子B";
    private final static String to = "柱子C";

    public static void main(String[] args) {
        move(5, from, mid, to);
    }
    /**
     * 汉诺塔
     * func:
     * if n!=0 then          ;预定值
     * func(n-1, a, c, b)    ;将n-1个盘子由a移动到b,以c为辅助柱子(注意参数顺序)
     * move a[n] to c        ;将a上的最后一个盘子移动到c
     * func(n-1, b, a, c)    ;将n-1个盘子由b移动到c,以a为辅助柱子
     * endif                 ;完成
     * @param n
     * @param from2
     * @param mid2
     * @param to2
     */
    public static void move(int n, String from2, String mid2, String to2){
        if(n == 1){
            System.out.println("移动盘子 " + n + " 从 " + from2 + " 到 " + to2);
        }else {
            move(n-1, from2, to2, mid2);
            System.out.println("移动盘子 " + n + " 从 " + from2 + " 到 " + to2);
            move(n-1, mid2, from2, to2);
        }
    }
}

5.二分法查找

package algorithm;
/**
 * 二分法查找值
 * 一定是有序表,升序降序都可以
 * 原理就是找中间值
 */
public class Algorithm_5 {

    public static void main(String[] args) {
        int[] array = {1,3,5,7,9,12,14,15,19,20,22,23,28,30};
        System.out.println(search(array, 0, array.length-1, 20));
    }
    /**
     * @param array 有序数组,但不限于数组
     * @param start 开始查找的数组下标
     * @param end 结束查找的数组下标
     * @param searchValue 要搜索的值
     * @return
     */
    public static int search(int[] array, int start, int end, int searchValue){
        if (array != null && array.length > 0){
            int middle = (start + end) / 2;
            int middleValue = array[middle];
            if (searchValue == middleValue){
                return middle;
            }else if (searchValue < middleValue){
                //查询值小于中值,在中值前面再次搜索,缩小范围
                return search(array, start, middle-1, searchValue);
            }else {
                //查询值大于中值,在中值后面再次搜索,缩小范围
                return search(array, middle+1, end, searchValue);
            }
        }else {
            return -1;
        }
    }
}

结束

相关文章
|
14天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
50 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
109 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
6天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
50 32
|
5天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
5月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
20天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
29 6
|
5月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
195 1
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
70 2
|
4月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
37 1
java基础(11)函数重载以及函数递归求和
|
3月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
176 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题