阅读这篇文章就证明你已经开始踏上了算法的修仙之路,接下来我会两天一更,介绍图解算法里面的算法的实现, 适合Java程序员阅读。


文章目录

  • 前言
  • 一、求数组的总值
  • 1. 题目
  • 2. 代码
  • 3.分析
  • 二、计算列表包含的元素数
  • 1. 题目
  • 2. 代码
  • 3.分析
  • 三、计算列表包含的元素数
  • 1. 题目
  • 2. 代码
  • 3.分析
  • 总结



前言

提示:这里可以添加本文要记录的大概内容:

接上一篇文章, 这篇文章是练习中等难度的递归, 为后面学习快速排序, 打好基础, 循循渐进, 慢慢来。


提示:以下是本篇文章正文内容,下面案例可供参考

一、求数组的总值

1. 题目

求,myList = {2,4,6} 的总和不用循环

2. 代码

public class RecursionDemo {

    public static void main(String[] args) {
        //动态数组, add remove get size等操作
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(4);
        list.add(6);

        //求列数组里面的总值
        Integer totalValue = totalValue(list,0);
        System.out.println("sum = " + totalValue);
    }

    //求数组的总值    -> 递归法
    public static Integer totalValue(ArrayList<Integer> list, Integer index) {
        if(index == list.size() - 1){
            return list.get(index); //基线条件
        }
        return list.get(index) + totalValue(list, ++index);//递归条件
    }
}

3.分析

算法图解javascript pdf下载 算法图解java版_递归

对于求和而言, 循环肯定比递归更加容易懂且性能高。 对于这个题目的关键在于你如何把循环里面i值也转化到递归中去。所以我就用了每次递归index都进行++操作, 递归结束条件也是小于数组长度。

二、计算列表包含的元素数

1. 题目

编写一个递归函数来计算列表包含的元素数不用循环和内置函数

2. 代码

public class RecursionDemo {

    public static void main(String[] args) {
        //动态数组, add remove get size等操作
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(4);
        list.add(6);

        //求数组里面包含的元素数
        Integer totalItem = totalItem(list,0);
        System.out.println("total = " + totalItem);
    }
    //求数组的总数   ->  递归法
    public static Integer totalItem(ArrayList<Integer> list, int index) {
        if(list.size() == index){
            return index;         //基线条件
        }
        return totalItem(list,++index);   //递归条件
    }
}

3.分析

算法图解javascript pdf下载 算法图解java版_java_02

我们的最终目的是为了练习递归,虽然Java里面有api去求数组的长度,自己现实一下也是可以的,这一题和上一题一样,也是利用了递归执行++操作,然后再利用数组的长度为递归的结束条件,最后index的最终值也是数组的长度 -1。

三、计算列表包含的元素数

1. 题目

找出列表的最大的数字 分别用循环和递归实现一遍。

2. 代码

public class RecursionDemo {

    public static void main(String[] args) {
        //动态数组, add remove get size等操作
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(4);
        list.add(6);

        //利用递归找出列表最大值
        Integer maxItem = getMaxItem(list);

        //最大值索引
        Integer maxItemIndex = 0;
        Integer maxItem1 = getMaxItem1(list,0,maxItemIndex);
        System.out.println("循环法 max = " + maxItem);
        System.out.println("递归法 max = " + maxItem1);
    }


    // 求数组最大值   -> 利用循环法求最大值 反之最小值也一样
    public static Integer getMaxItem(ArrayList<Integer> list) {
        //最大值索引
        Integer maxItemIndex = 0;
        for(int i = 0; i < list.size(); i++){
            if(list.get(maxItemIndex) < list.get(i)){
                maxItemIndex = i;
            }
        }
        return list.get(maxItemIndex);
    }

    // 求数组最大值   -> 利用递归法求最大值 反之最小值也一样
    public static Integer getMaxItem1(ArrayList<Integer> list,Integer index,Integer maxItemIndex) {
        if(list.get(maxItemIndex) < list.get(index)){
            maxItemIndex = index;
        }
        if(index == list.size()-1){     //基线条件
            return list.get(maxItemIndex);
        }
        return getMaxItem1(list,++index,maxItemIndex);    //递归条件
    }

3.分析

算法图解javascript pdf下载 算法图解java版_java_03

对于求最大值, 其实递归和循环都有共同之处,都需要一个一个判断,然后选出一个最大值, 不同之处在于实现原理不同。递归需要基线条件和递归条件,而这一题的基线条件就是数组长度和循环结束的条件一样,只是方式不同。

总结

上一篇文章是介绍了递归的原理,这篇文章主要是给兄弟练练手的题目,如果想挑战更难的难度,可以去做汉诺塔问题,快速排序等问题。这一篇文章就是练习练习递归,让大家知道递归可能有时候比循环好,也可能比循环差,这需要自己去判断。