• 06--图解数据结构之递归小例子


    零、前言--递归:

    优点: 简洁+装B
    代价:函数调用+系统栈空间
    另外:使用递归,代码易不易读,这要因人而异,水平高的可能认为递归很易读,不递归反而罗里吧嗦的麻烦。
    递归函数感觉就是自己调用自己,最后给自己一个台阶下
    在此之前最好了解一下栈的机制:可参考:04-图解数据结构之栈--Stack


    1.吃苹果
    
    /**
     * 作者:张风捷特烈
     * 时间:2018/9/20 0020:16:45
     * 邮箱:1981462002@qq.com
     * 说明:一个简单的吃苹果递归
     */
    public class AppleEaterClient {
        public static void main(String[] args) {
            Apple apple = new Apple(5);
            eat(apple);
            //苹果还剩4口
            //苹果还剩3口
            //苹果还剩2口
            //苹果还剩1口
            //苹果还剩0口
            //苹果吃完了
        }
    
        private static void eat(Apple apple) {
            if (apple.size <= 0) {
                System.out.println("苹果吃完了");
                return;
            }
            apple.size = apple.size - 1;
            System.out.println("苹果还剩" + apple.size + "口");
            eat(apple);
    
        }
    
        private static class Apple {
            public int size;
            public Apple(int size) {
                this.size = size;
            }
        }
    }
    

    2.拆分整数
    /**
     * 作者:张风捷特烈
     * 时间:2018/10/6 0006:21:46
     * 邮箱:1981462002@qq.com
     * 说明:2306====>依次打印2 3 0 6
     */
    public class PrintInt {
        public static void main(String[] args) {
            printInt(2306);
        }
    
        private static void printInt(int num) {
            if (num <= 0) {
                return;
            }
            printInt(num / 10);
            System.out.println(num % 10);
        }
    }
    
    9414344-c5048a5dfc65c672.png
    递归1.png

    3.递归求数组和
    /**
     * 作者:张风捷特烈
     * 时间:2018/9/20 0020:16:56
     * 邮箱:1981462002@qq.com
     * 说明:递归求数组和
     */
    public class Sum {
        public static int sum(int[] arr) {
            return sum(arr, 0);
        }
    
        /**
         * 递归函数
         * @param arr 数组
         * @param start 开始位置
         * @return 从开始位置到最后所有元素和
         */
        private static int sum(int[] arr,int start) {
            if (start == arr.length) {//终结点
                return 0;
            }
    
            return arr[start] + sum(arr, start + 1);
        }
    
        public static void main(String[] args) {
            System.out.println(sum(new int[]{1, 2, 3, 4}));
        }
    }
    
    9414344-973566791797aec2.png
    递归.png

    4.将一个十进制转换为n进制
    /**
     * 作者:张风捷特烈
     * 时间:2018/10/10 0010:15:23
     * 邮箱:1981462002@qq.com
     * 说明:将一个十进制转换为n进制
     */
    public class ScaleTo {
        public static void main(String[] args) {
            scaleTo(77772, 2);//10010111111001100
            scaleTo(77772, 8);//227714
            scaleTo(77772, 16);//12FCC
        }
    
        /**
         * 将一个十进制转换为n进制
         *
         * @param num 数字
         */
        private static void scaleTo(int num, int n) {
            char[] chars = new char[]{
                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                    'A', 'B', 'C', 'D', 'E', 'F'
            };
    
            if (num == 0) {
                return;
            }
            scaleTo(num / n, n);
            int i = num % n;
            System.out.print(chars[i]);
        }
    }
    

    结合栈结构,对递归debug一步步调试,或者自己画画图,更容易明白递归是怎么一步步走的,这是非常重要的。对于树的操作少不了递归,如果对递归有丝毫疑惑,那后面将会寸步难行。递归是一个小小的高山,是需要认真爬过去的,马马虎虎就想过去,不存在的。下一部分就将对二叉树全面进攻。


    后记:捷文规范

    1.本文成长记录及勘误表
    项目源码 日期 备注
    V0.1--无 2018-10-2 06--图解数据结构之递归小例子
    V0.2--无 2018-10-10 添加:将一个十进制转换为n进制的递归
    2.更多关于我
    笔名 QQ 微信 爱好
    张风捷特烈 1981462002 zdl1994328 语言
    我的github 我的简书 我的CSDN 个人网站
    3.声明

    1----本文由张风捷特烈原创,转载请注明

    2----欢迎广大编程爱好者共同交流
    3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    4----看到这里,我在此感谢你的喜欢与支持

  • 相关阅读:
    Python(一)-基础不牢,地动山摇
    微信公众号开启企业付款到用户
    CSS多行显示省略号
    angular service自定义返回
    CSS input radio和checkbox样式
    angular微信支付url未注册
    angular+ionic的兼容性问题
    js 字符串和16进制的互相转换
    js循环变量赋值
    CSS 两层实现垂直居中(外层固定宽高,内层文本不定行数)
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781853.html
Copyright © 2020-2023  润新知