算法入门--递归

2023-10-28

 不死神兔:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

规律:1 1 2 2+1 3+2 5+3.。。。。。

这就是暴力美学:

//不死神兔public class text14 {   
    public static void main(String[] args) {
        int[] a = new int[20];
        a[0] = 1;
        a[1] = 1;
        for (int i = 2; i < a.length; i++) {
            a[i] = a[i - 1] + a[i - 2];
        }
        System.out.println(a[19]);
    }
}

 递归:

 public static int tu(int num) {
        if (num == 1 || num == 2) return 1;
        else return tu(num - 1) + tu(num - 2);
        }

1.什么是递归(1)?

方法直接或者间接自己调用自己的编程技巧称为递归( recursion)

2.什么是递归死循环?

递归的方法无限调用自己,无法终止,出现栈内存溢出

3.什么是递归(2)                ·?

  • 方法直接调用自己或者间接调用自己的形式称为方法递归( recursion)。
  • 递归做为一种算法在程序设计语言中广泛应用。

4.递归的形式:

  • 直接递归:方法自己调用自己。
  • 间接递归:方法调用其他方法,其他方法又回调方法自己。
public class hong {
        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(); // 方法递归 间接递归   
        }

        private static void test3() {
            System.out.println("=======test3被执行========");
            test2();
        }
    }

5.递归的弊端:

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

6.递归案例导学-计算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

7.递归解决问题的思路:

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

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

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

递归的终结点:f(1)

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

f(5) =  f(4) * 5

f(4) =  f(3) * 4

f(3) =  f(2) * 3

f(2) =  f(1) * 2

f(1) =  1

8.案例:递归求阶乘的执行流程

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rW357u1aG9uZw==,size_20,color_FFFFFF,t_70,g_se,x_16

304ca0ac74894a3fac3098b1d295aca6.png

9.递归算法练习(猴子吃桃)

猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个 第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个 以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个 等到第10天的时候发现桃子只有1个了。

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

分析: 整体来看,每一天都是做同一个事件,典型的规律化问题,考虑递归三要素: 递归公式: 递归终结点: 递归方向:

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;
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法入门--递归 的相关文章

随机推荐

  • java解决高并发之数据库连接池配置

    使用的IDE是IDEA 项目是springboot框架的项目 最近一直在处理高并发的问题 大致情况是这样的 大概有五六千人会在中午十二点同时访问网站 操作数据库 导致服务器崩溃 对于频繁修改数据的这种情况 例如 用户要抢商品 且抢完后要刷新
  • kuiper安装

    1 使用docker方式安装 docker pull lfedge ekuiper latest docker run p 9081 9081 d name kuiper e MQTT SOURCE DEFAULT SERVER tcp 1
  • [Android studio] 第15节 ConstraintLayout控件

    ConstraintLayout 是 Android 中的布局容器 它是一个灵活且强大的布局工具 用于创建复杂的界面布局 它通过使用约束 constraints 来定义子视图之间的关系和对齐方式 以下是 ConstraintLayout 常
  • 【计算机网络】301 永久重定向的缓存问题

    301 永久重定向的缓存问题 问题描述 在使用 301 的时候常常会遇到一个问题 当服务端针对某个 URL 设置了 301 永久重定向后 不管怎么重新设置或者删除设置 浏览器在进行访问时仍然会使用最开始缓存的 301 重定向 而服务端无法控
  • Centos7搭建bsc全链节点

    Centos7搭建bsc全链节点 服务器配置 CPU 8 Cores 16 Threads RAM 131072 MB Storage 2x 2000GB NVMe Bandwidth 8400 65 GB of 10000 GB OS C
  • 如何打开电脑的服务选项

    1 首先找到此电脑 我的电脑 单击鼠标右键 找到管理选项 单击 管理 2 现在 打开服务设置对话框 在左侧菜单栏找到 服务和应用程序 打开下拉菜单 在下拉菜单 单击 服务 打开计算机内所有的服务 3 单击服务 打开所有的服务选项 在右面栏里
  • 电子学会 青少年软件编程(202209)(C语言)(树&堆&图)等级考试(七级)试题 T3 Sequence

    T3 Sequence 2442 Sequence Sequence Poj2442 堆 优先队列 Sequence Poj2442 堆 优先队列 Magic的博客 CSDN博客 sequence poj2442 POJ 2442 二叉堆
  • LVS+Keepalived群集

    目录 一 keepalived介绍 二 Keepalived及其工作原理 三 Keepalived原理剖析 四 Keepalived体系主要模块及其作用 实例 NFS服务器 192 168 80 200 主DR 服务器 192 168 30
  • TensorFlow2(版本2.5.0)学习笔记(含keras_bert、W2V)

    目录 一 设置CPU GPU运行环境 二 tf定义变量与简单操作 基于tf2做数据处理 Tokenizer 1 使用TF2实现token2id padding 2 基于gensim 版本 3 8 3 3 基于keras bert bert4
  • threejs物理效果和声音

    个人博客地址 https cxx001 gitee io 一 Threejs中如何创建物理场景 threejs中创建物理场景我们用它的扩展库 Physijs 它可以使场景中的对象有重力效果 可以相互碰撞 施加力之后可以移动 还可以通过合页和
  • Java 导入验证数据最后一行

    description 判断数据最后一行 author lkm date 2023 7 13 17 11 public static boolean isEmptyRow Row row if row null row toString i
  • python安装模块速度太慢了,教你一招提升百倍安装速度

    在python开发中 经常需要使用到各种各样的库 pip又是我们常用的安装工具 但是国外的源下载速度实在太慢 经常导致超时 对于这种情况我们可以修改pip的下载源为国内源 这样就可以大幅度提升下载速度 如何修改源 1 临时更换镜像源 可以通
  • 【代码实践】使用Garch模型估计VaR

    title Value at Risk estimation using GARCH model author Ionas Kelepouris Dimos Kelepouris date July 6 2019 output html d
  • 神经网络基础04-25个神经网络模型

    参考链接 https www toutiao com i6432188985530909186 前言 神经元 卷积神经元 Convolutional cells 和前馈神经元非常相似 除了它们只跟前一神经细胞层的部分神经元有连接 因为它们不
  • G - Card Game

    G Card Gamehttps vjudge csgrandeur cn problem Gym 102263G Zeyad and Ehab are playing a simple card game each player init
  • FISCO BCOS(十六)——— ubuntu安装go语言环境

    1 创建安装目录 mkdir home go 2 下载go安装包 wget https golang google cn dl go1 17 8 linux amd64 tar gz 3 解压go安装包 sudo tar zxvf go1
  • setup.py方式打包自己的python代码并可以用pip install安装

    setup py方式打包自己的python代码并可以用pip install安装 所需文件及目录规范 示例演示 打包静态文件补充说明 引用自己打的包 所需文件及目录规范 注意setup py文件和MANIFEST in文件需要放在和你需要打
  • 扩散模型Diffusion Model 【质量提升2.0】【扩散模型】

    扩散模型Diffusion Model 质量提升2 0 扩散模型 文章目录 扩散模型Diffusion Model 质量提升2 0 扩散模型 一 扩散模型简介 二 前向扩散简介 三 逆向扩散简介 四 目标函数 一 扩散模型简介 其最早出现在
  • 为什么人人都该懂点LLVM

    原文链接 http adriansampson net blog llvm html 作者 Adrian Sampson 译者 张洵恺 只要你和程序打交道 了解编译器架构就会令你受益无穷 无论是分析程序效率 还是模拟新的处理器和操作系统 通
  • 算法入门--递归

    不死神兔 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问第二十个月的兔子对数为多少 规律 1 1 2 2 1 3 2 5 3 这就是暴力美学 不死神兔public class t