• 算法思想篇递归


    1.什么情况下使用递归

      可以将一个问题分解为很多子问题

      这个问题的求解思路与子问题的思路完全一样

      有递归的终止条件

    2.斐波那契

    package com.jun.algorithm.foundation.thought;
    
    import org.junit.Test;
    
    /**
     * 斐波那契
     * 递归的条件:
     * 一个问题可以分为几个子问题
     * 子问题的求解思路都是完全一样
     * 存在递归的终止条件
     * <p>
     * 这里将会一步步的优化
     * 先递归,然后循环,然后使用缓存,最后使用尾递归方式
     */
    public class Fibonacci {
        /**
         * 递归方式
         * 时间复杂度:2^n
         */
        public int fab(int n) {
            if (n <= 2) {
                return 1;
            }
            return fab(n - 1) + fab(n - 2);
        }
    
        /**
         * 循环
         * 时间复杂度 n
         *
         * @param n
         */
        public int noFab(int n) {
            if (n <= 2) {
                return 1;
            }
            int a = 1;
            int b = 1;
            int c = 0;
            for (int i = 3; i <= n; i++) {
                c = a + b;
                a = b;
                b = c;
            }
            return c;
        }
    
        private int[] data = new int[6];
    
        /**
         * 使用缓存,计算过的不在计算了
         */
        public int fabWithArray(int n) {
            if (n <= 2) {
                return 1;
            }
            if (data[n] > 0) {
                return data[n];
            }
            int result = fabWithArray(n - 1) + fabWithArray(n - 2);
            data[n] = result;
            return result;
        }
    
        /**
         * 尾递归
         * 倒着算
         * 传递结果
         * preResult:上次的结果
         * result:当前的结果
         * <p>
         * 尾递归的条件:
         * 最后的返回,不要再做任何的操作
         */
        public int tailFab(int n, int preResult, int result) {
            if (n <= 2) {
                return result;
            }
            // 传递下去,再做一步计算
            return tailFab(n - 1, result, preResult + result);
        }
    
        @Test
        public void test() {
            int fab = fab(6);
    
            int noFab = noFab(6);
            System.out.println("noFab=" + noFab);
            System.out.println("fab=" + fab);
    
            int i = tailFab(6, 1, 1);
            System.out.println("fabWithArray=" + i);
        }
    }
  • 相关阅读:
    JQuery脚本-通过禁用按钮防止表单重复提交
    获得图片的圆形头像效果
    jquery通过submit()和serialize()提交表单
    nginx location 配置阐述优先级别使用说明
    友盟(Swift)-集成、统计用户数量、具体页面访问数量、具体按钮点击数量
    点击按钮,使按钮进行左右翻转动画
    清除指定区域
    语音播报-文字转系统声音
    颜色线性渐变-CAGradientLayer
    popover带箭头弹框
  • 原文地址:https://www.cnblogs.com/juncaoit/p/16054100.html
Copyright © 2020-2023  润新知