• 递归算法(recursion algorithm)


    递归算法

    什么是递归算法

    在过程或者函数里调用自身的算法;

    递归算法(recursion algorithm),通过重复将问题分解为同类的子问题而解决问题的方法,

    Java中函数可以通过调用自身来进行递归,大多数编程语句皆是如此;

    递归的作用可以可以完全取代循环。

    递归阶乘

    package com.sin.demo.recursive;
    
    /**
     * @author sin
     * @date 2022/11/2
     * @apiNote
     */
    public class RecursiveDemo {
        public static void main(String[] args) {
            int a = factorialTest(5);
            System.out.println(a);
    
        }
    
        /**
         * 递归阶乘
         * @param a 阶乘参数
         * @return
         */
        public static int factorialTest(int a) {
            if (a == 0)
                return 1;
            else
                return a * factorialTest(a - 1);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    结果

    在这里插入图片描述

    循环阶乘

    public static void main(String[] args) {
            int a = factorialTest1(5);
            System.out.println(a);
    
        }
    
        /**
         * 循环阶乘
         * @param a 阶乘数
         * @return
         */
        public static int factorialTest1(int a){
            int sum = 1;
            for (int i = 1 ;i<=a;i++)
                sum *=i;
            return sum;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果

    在这里插入图片描述

    分析递归

    通过栈角度来理解递归方法的调用过程

    栈(后进先出)(先进后出)原则

    第一步

    在 factorialTest()方法第一次被调用的时候,参数 a 为 5,走else代码块,执行 a * factorialTest(a - 1),相当于a * factorialTest(3)时栈的状态

    在这里插入图片描述

    第二步

    返回值存储器时没有返回值的,在调用factorialTest(4)后,栈的状态

    在这里插入图片描述

    第三步

    返回值存储器时没有返回值的,在调用factorialTest(3)后,栈的状态
    在这里插入图片描述

    第四步

    返回值存储器时没有返回值的,在调用factorialTest(2)后,栈的状态

    在这里插入图片描述

    第五步

    返回值存储器时没有返回值的,在调用factorialTest(1)后,栈的状态

    在这里插入图片描述

    第六步

    返回值存储器时没有返回值的,在调用factorialTest(0)后,栈的状态

    在这里插入图片描述

    最后符合符合if条件,有返回值

    栈的后进先出原则,进行阶乘

    在这里插入图片描述

    递归代码虽然只用一份,单执行的过程中,每调用一次就会入栈一次,生成不同的参数,局部变量即返回地址;

  • 相关阅读:
    【ESP32_8266_WiFi (十二)】ESP8266客户端HTTP API应用实例
    Redis系列之——深入了解Redis的String,源码层级+极易理解图片解析!
    开发工具 - Ubuntu版本VS code离线安装
    神经网络中的一些优化器整理
    四十分钟带你玩儿转Python-OpenCV(一)
    nginx反向代理
    项目:UDP聊天室
    [附源码]java毕业设计构建养猪场管理系统
    机器学习即代码的时代已经到来
    软件工程 第一次随堂练习
  • 原文地址:https://blog.csdn.net/qq_44715376/article/details/127648124