递归

1. 递归的概述

什么是方法递归?

方法直接调用自己或者间接调用自己的形式称为方法递归(recursion)。

递归作为一种算法在程序设计语言中广泛应用。

 

递归的形式?

直接递归:方法自己调用自己

间接递归:方法调用其他方法,其他方法又回调方法自己。

 

方法递归存在的问题?

递归如果没有控制好终止,会出现递归死循环,导致内存溢出现象。

 

代码实例:递归的形式

/**
 * 递归形式
 */
public class RecursionDemo01 {
    public static void main(String[] args) {
        test2();
    }

    public static void test(){
        System.out.println("=====test=====");
        test();     // 方法递归 直接递归形式
    }

    public static void test2(){
        System.out.println("=====test2=====");
        test3();     // 方法递归 间接递归形式
    }

    public static void test3(){
        System.out.println("=====test3=====");
        test2();
    }
}

这里只是展示递归的两种形式,此程序运行后,会出现死循环。

 

2. 递归算法的三要素和执行流程

【案例】递归案例导学-计算1-n的阶乘

需求:计算1-n的阶乘的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。

分析:

①加入我们认为存在一个公式是f(n)= 1*2*3*4*5*6*7*...*(n-1)*n

②那么公式等价形式就是:f(n)= f(n-1)*n

③如果求的是1-5的阶乘的结果,我们应该如何应用上述公式计算。

④f(5) = f(4) * 5

    f(4) = f(3) * 4

    f(3) = f(2) * 3

    f(2) = f(1) * 2

    f(1) = 1

 

【代码实例】

public class RecursionDemo02 {
    public static void main(String[] args) {
        System.out.println(f(5));     // 120
    }
    
    public static int f(int n){
        if(n == 1){
            return 1;
        }else{
            return f(n-1) * n;
        }
    }
}

 

递归解决问题的思路:

把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

 

递归算法三要素大体可以总结为:

●递归的公式:f(n) = f(n-1) * n;

●递归的终结点:f(1)

●递归的方向必须走向终结点 

 

【案例】递归求阶乘执行流程

 

3. 递归常见案例

【案例】递归案例导学-计算1-n的和

需求:计算1-n的阶乘的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。

分析:

①加入我们认为存在一个公式是f(n)= 1+2+3+4+5+6+7+...+(n-1)+n

②那么公式等价形式就是:f(n)= f(n-1)+ n

③如果求的是1-5的阶乘的结果,我们应该如何应用上述公式计算。

④f(5) = f(4) + 5

    f(4) = f(3) + 4

    f(3) = f(2) + 3

    f(2) = f(1) + 2

    f(1) = 1

 【代码实例】

public class RecursionDemo02 {
    public static void main(String[] args) {
        System.out.println(f(5));     // 15
    }

    public static int f(int n){
        if(n == 1){
            return 1;
        }else{
            return f(n-1) + n;
        }
    }
}

 

4. 递归经典案例:猴子吃桃问题

 【案例】猴子吃桃问题

猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,有多吃了一个

第二天,吃了剩下的一般,觉得好不过瘾,有多吃了一个

以后每天按照上述方法吃,等到第10天,发现只有1个桃子了。

需求:请问猴子第一天摘了多少个桃子?

/**
 *   目标:猴子吃桃
 *   公式:
 *   f(x) - f(x)/2 - 1 =  f(x + 1)
 *   2f(x) - f(x) - 2 = 2f(x + 1)
 *   f(x) = 2f(x + 1) + 2
 *
 *   求f(1) = ?
 *   终结点 f(10) = 1;
 *   递归的方向:合理的
 */
public class RecursionDemo03 {
    public static void main(String[] args){
        System.out.println(f(1));
        System.out.println(f(2));
        System.out.println(f(3));
    }

    public static int f(int n){
        if(n == 10){
            return 1;
        }else{
            return 2 * f(n + 1) + 2;
        }
    }
}

 

posted @   白森  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示