数据结构之:递归思想

news2025/1/11 22:58:31
(一)递归概念
将复杂问题 递推分解为最简问题 然后将结果回归的过程
Windows - Linux
Linux = Linux is not Unix
使用方法: 自己调用自己
(二)斐波那契数列
兔子问题
有一对大兔子 每个月繁衍 一对小兔子(一公一母)
小兔子 每个月生长为 大兔子
现有一对小兔子 一年后 有多少对?
M1 1 A
M2 1 A~
M3 2 A->B
M4 3 A->C + B~
M5 5 A->D + B->E + C~
M6 8 A->F + B->G + C->H + D~ + E~
当前的所有兔子 = 上个月的所有兔子 + 这个月新生的兔子(可以繁衍的兔子)
= 上个月的所有兔子数量 + 上上个月的所有兔子数量(经过了一个月的生长周期)
Mn = M(n-1) + M(n-2)
M5 = M4 + M3
= (M3+M2) + (M2+M1)
= (M2+M1 + M2) + (M2+M1)
= 1+1+1 + 1+1 = 5
M1=1 M2=1
使用方式:
1 )推导出递推公式 —— 找规律
2 )找到递推的出口 —— 找出口
    public static int fib(int N) {
        if (N == 1) return 1;
        if (N == 2) return 1;
        System.out.println("求第" + N + "个月的兔子数量");
        System.out.println("转化为求第" + (N - 1) + "个月和第" + (N - 2) + "个月的兔子数量");
        return fib(N - 1) + fib(N - 2);
    }
大部分递归 可以转化为迭代处理
Make it work,Make it right,Make it fast
思路:使用数组存储,通过 n-1 n-2 的值进行计算

    public static int fib1(int N) {
        // 6 —— 0 1 2 3 4 5
        // fib(0) = 0 有时需要处理
        if (N <= 1) return 1;
        int[] arr = new int[N];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[N - 1];
    }
递归经典应用之汉诺塔
汉诺塔
印度的恒河 瓦拉那西 诞生婆罗门教
放了三根柱子,其中一个根柱子上放了 64 个圆盘
需要将全部圆盘 移动到另一根柱子上
并且 每次只能移动一个 移动过程中 小圆盘必须在大圆盘之上
为何不可完成?
分析:
一个圆盘 A->C
两个圆盘 A->B A->C B->C
三个圆盘 A->C A->B C->B ( 把前两个圆盘 从 A 移动到 B)
A->C ( 移动最大的圆盘 )
B->A B->C A->C ( 再把前两个圆盘 从 B 移动到 C)
N 个圆盘
先把前 N-1 个圆盘 A 移动到 B ( 经由 C)
再把最大的圆盘 A 移动到 C
最后把前 N-1 个圆盘 B 移动到 C ( 经由 A)
移动次数
H(1) = 1
H(2) = 3
H(3) = H(2) + 1 + H(2) = 7
H(4) = 7 + 1 + 7 = 15
H(N) = H(N-1) + 1 + H(N-1) = 2^N - 1
// 四个参数 有n个圆盘 需要从A柱子移动到C 经由B
// 起始 中间 终点
public static void hanoi(int n, char A, char B, char C) {
// 出口
if (n == 1) {
System.out.println(A + "->" + C);
return;
}
// 先把前N-1个圆盘 从A移动到B (经由C)
// 再把最大的圆盘 从A移动到C
// 最后把前N-1个圆盘 从B移动到C (经由A)
hanoi(n - 1, A, C, B);
System.out.println(A + "->" + C);
hanoi(n - 1, B, A, C);
}
public class Fibonacci {


    public static void main(String[] args) {
        System.out.println(fib1(6));
    }

    // 返回第n个月有多少只兔子
    public static int fib(int N) {
        if (N == 1) return 1;
        if (N == 2) return 1;
        System.out.println("求第" + N + "个月的兔子数量");
        System.out.println("转化为求第" + (N - 1) + "个月和第" + (N - 2) + "个月的兔子数量");

        return fib(N - 1) + fib(N - 2);
    }


    public static int fib1(int N) {
        // 6 —— 0 1 2 3 4 5
        // fib(0) = 0  有时需要处理
        if (N <= 1) return 1;
        int[] arr = new int[N];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[N - 1];
    }
}
public class Hanoi {

    public static void main(String[] args) {
        //三个圆盘  A->C   A->B  C->B (把前两个圆盘 从A移动到B)
        //         A->C  (移动最大的圆盘)
        //         B->A  B->C  A->C (再把前两个圆盘 从B移动到C)
        hanoi(3, 'A', 'B', 'C');
    }

    // 四个参数  有n个圆盘  需要从A柱子移动到C  经由B
    //                                  起始    中间     终点
    public static void hanoi(int n, char A, char B, char C) {
        // 出口
        if (n == 1) {
            System.out.println(A + "->" + C);
            return;
        }

        //    先把前N-1个圆盘  从A移动到B (经由C)
        //    再把最大的圆盘  从A移动到C
        //    最后把前N-1个圆盘  从B移动到C (经由A)
        hanoi(n - 1, A, C, B);
        System.out.println(A + "->" + C);
        hanoi(n - 1, B, A, C);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 设计模式】UML 之类图

UML 之类图前言&#xff1a;什么是 UML &#xff1f;1 类图概念2 类的表示方式3 类与类之间关系的表示方式3.1 关联关系3.1.1 单向关联3.1.2 双向关联3.1.3 自关联3.2 聚合关系3.3 组合关系3.4 依赖关系3.5 继承关系3.6 实现关系前言&#xff1a;什么是 UML &#xff1f; 定义…

Linux 软件包下载加速工具:APT Proxy

本篇文章将继续介绍这个仅有 2MB 身材大小的 Linux 软件包缓存和加速工具&#xff1a;APT Proxy。 相比老牌的 apt cacher ng 而言&#xff0c;除了尺寸更小、内存占用更低&#xff08;10M以内&#xff09;、它还拥有无需配置&#xff0c;开箱即用等特点。 写在前面 年中的时…

!与~有什么区别

目录 将整型数据转换为二进制的函数 利用函数查看&#xff01;与~之后的数据有何不同 以一个非0数据作为例子 以0作为例子 我们都知道&#xff01;与~都是用于取反的。那么这两个有什么区别呢&#xff1f; 我们百度结果如下&#xff0c;很明显&#xff0c;八股文。我接下…

element-ui时间选择器(DatePicker )数据回显

系列文章目录 第一篇【element-ui】table表格底部合计自定义配置 目录 前言 一、element-ui时间选择器&#xff08;DatePicker &#xff09;是什么&#xff1f; DatePicker 日期选择器 二、返回数据格式 1.引入 总结 前言 需求&#xff1a;element-ui时间选择器&#…

【报错】QT Release NO CMAKE_CXX_COMPILER could be found

NO CMAKE_CXX_COMPILER could be found 错误&#xff1a; Tell CMake where to find the compiler by setting either the environmentvariable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path tothe compiler, or to the compiler name if it …

PostgreSQL数据库动态共享内存管理器——dynamic shared memory segment

首先看dynamic_shared_memory_type GUC参数&#xff0c;该参数用于指定dynamic shared memory implementation类型&#xff08;DSM_IMPL_POSIX、DSM_IMPL_SYSV、DSM_IMPL_WINDOWS、DSM_IMPL_MMAP&#xff0c;定义在src/include/storage/dsm_impl.h文件中&#xff09;。了解一下…

前段入门-CSS

目录1 CSS 快速入门1.1 CSS 的介绍1.2 CSS 的组成2 基本语法2.1 CSS 的引入方式2.1.1 内联样式2.1.2 内部样式2.1.3 外部样式2.2 注释2.3 选择器2.3.1 基本选择器2.3.2 属性选择器2.3.3 伪类选择器2.3.4 组合选择器2.4 总结3 CSS 案例-头条页面3.1 案例效果3.2 案例分析3.2.1 边…

【第三部分 | 移动端开发】4:Rem布局

目录 | Rem布局简介 | 单位 rem | 媒体查询 | 根据不同的媒体引入不同的CSS | less基础 概述与安装 基础使用&#xff1a;创建less文件 基础使用&#xff1a;变量 基础使用&#xff1a;用Esay LESS插件把less文件编译为css 基础使用&#xff1a;嵌套 基础使用&#x…

cuda在windows10安装教程

CUDA安装教程&#xff0c;以Windows10系统为例&#xff1a; CUDA.exe安装 查看电脑的支持的CUDA版本&#xff0c;按照如下教程&#xff1a; 首先找到这个图标&#xff0c;也就是nvidia控制面板&#xff0c;然后打开&#xff1a; 然后点击左下角系统信息 再点击“组件”&…

LabVIEW性能和内存管理 8

LabVIEW性能和内存管理 8 本文介绍LabVIEW性能和内存管理的几个建议8。 MemoryFragmentation内存碎片 内存管理器分配和释放内存需要时间&#xff0c;这会降低执行速度。在某些情况下&#xff0c;即使假设有足够的可用内存&#xff0c;也会发生内存不足错误。 上图显示了实际…

【练拳不练功,到老一场空】深入浅出计算机组成原理

深入浅出计算机组成原理 文章目录深入浅出计算机组成原理计算机的基本组成硬件设备组成CPU内存主板I/O 设备硬盘显卡冯.诺依曼体系结构运算器/处理器单元控制器存储器输入设备输出设备举个栗子&#xff1a;计算机的性能与功耗响应时间吞吐率CPU时钟/主频计算机的功耗计算机的指…

jdk8新特性(Lambda、Steam、函数式接口)

JDK8新特性 JDK8新特性Lambda表达式函数式&#xff08;Functional&#xff09;接口方法引用与构造器引用方法引用构造器引用强大的 StreamAPI创建Stream方式Stream 的中间操作Stream 的终止操作Optional 类Java 8 (又称为jdk 1.8)是Java语言开发的一一个主要版本。 Java 8是ora…

Electron 之通讯模块ipcMain 和 ipcRenderer

Electron一个使用HTML、CSS和JavaScript开发桌面应用程序的框架。Electron可以生成在Windows、macOS和Linux上运行的应用程序&#xff0c;借助Electron可以把我们的web端应用直接移植到桌面端而无需再次开发&#xff0c;这样我们可以使用同一套代码在不同平台上运行应用&#x…

数据收集面可视化

数据收集面可视化&#xff08;Data Collector Surface Visualization&#xff09;分析选项允许用户指定模型中的某一表面&#xff0c;在光线追迹的过程中收集光线数据&#xff0c;并显示或者输出该面的照度&#xff08;或相关的物理量&#xff09;。该分析选项允许计算&#xf…

电脑网页打不开提示错误err connection怎么办?

网页打不开显示err_connection_reset网络错误&#xff0c;怎么解决err_connection_reset网络错误&#xff1f;下面我们就来看看解决电脑err_connection_reset网络错误的方法&#xff0c;请看下文详细介绍。 方法一&#xff1a;组件注册 1、我们点下键盘的winR&#xff0c;输入…

2. 选择排序

2.1 内存的工作原理 需要将数据存储到内存时&#xff0c;你请求计算机提供存储空间&#xff0c;计算机给你一个存储地址。 需要存储多项数据时&#xff0c;有两种基本方式——数组和链表。 2.2 数组和链表 有时候&#xff0c;需要在内存中存储一系列元素。 使用数组意味着所…

ElasticSearch面试

Welcome to Elastic Docs | Elastic 1. ES的结构和底层实现 ES的整体结构? 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0…

koa框架(二) mvc 模式及实现一个koa框架的web服务

mvc三层架构 mvc&#xff0c; 即 model 、controller、view&#xff1b;mvc模式将model、view、controller分离&#xff1b;使用mvc分层是系统更加灵活&#xff0c;扩展性更强。让程序更加直观、复用性更强、可维护性更强。 model 负责数据访问&#xff1b;controller 负责消息…

嵌入式设备文件系统构建——增加用户登录功能

1、修改inittab文件 #first:run the system script file ::sysinit:/etc/init.d/rcS# 进入命令行 #::askfirst:-/bin/sh#添加执行登录验证 ::sysinit:/bin/login::ctrlaltdel:-/sbin/reboot #umount all filesystem ::shutdown:/bin/umount -a -r #restart init process ::res…

2022-11-16 几种三角函数的图形

为了方便查看几个函数的关系图&#xff0c;记录一下几种三角函数的大致图像。 三角函数&#xff1a;tan⁡(x)\tan(x)tan(x)&#xff0c;cos⁡(x)\cos(x)cos(x)&#xff0c;sin⁡(x)\sin(x)sin(x)。 三角函数&#xff1a;tan⁡(x2)\tan(\dfrac{x}{2})tan(2x​)&#xff0c;cos…