[练习]如何使用递归算法?

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏 

目录

1. 递归概述

2.汉诺塔问题 

 题目描述​编辑

题解 

代码实现       

3.合并两个有序链表

题目描述 

题解 

代码实现 

4.反转链表

题目描述 

题解 

​编辑 代码实现

 5.Pow(x, n)

题目描述 

题解 

代码实现 


1. 递归概述

  1. 什么是递归?

简单来说,就是函数自己调用自己的情况.

  2. 为什么用递归?

 本质上:主问题 --> 相同的子问题;  子问题 --> 相同的子问题.

3. 如何理解递归? 

 1.递归展开的细节图.(不用有强迫症,每道题都展开,就得不偿失了)

 2. 二叉树的题目.

 3.宏观看待递归的过程

  • 不要在意递归的展开图
  • 把递归当作一个黑盒
  • 相信这个黑盒一定能完成这歌任务.

4.如何写好一个递归? 

 1.先找到相同的子问题! ---> 函数头的设计

 2. 只关心某一个子问题是如何解决的. ----> 函数体书写

 3. 注意一下递归函数的出口即可. 

2.汉诺塔问题 

 题目描述

题解 

可以被解释为:
1 . 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘⼦移动到C柱上。
2. 规模为 n 的问题可以被拆分为规模为 n-1 的⼦问题:
  • 将 A 柱上的上⾯ n-1 个盘⼦移动到B柱上。
  • 将 A 柱上的最⼤盘⼦移动到 C 柱上,然后将 B 柱上的 n-1 个盘⼦移动到C柱上。
  • 当问题的规模变为 n=1 时,即只有⼀个盘⼦时,我们可以直接将其从 A 柱移动到 C 柱。

 综上从宏观的角度分析:

1. 重复的子问题。(函数头)

       将A柱子上的盘子,借助B柱子,转移到C柱子上.

 2.只关心某一个子问题在做什么。(函数体)

    3. 递归出口.  -->   N == 1

 分析完之后,代码其实已经写完了。

代码实现       

    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {dfs( A,  B,  C, A.size());}public void dfs(List<Integer> A, List<Integer> B, List<Integer> C,int n) {if(n == 1) {C.add(A.remove(A.size() - 1));return;}dfs(A, C, B ,n - 1);C.add(A.remove(A.size() - 1));dfs(B, A, C, n - 1);}

3.合并两个有序链表

题目描述 

题解 

  1. 递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;
  2.  函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理;
  3. 递归出⼝:当某⼀个链表为空的时候,返回另外⼀个链表。

代码实现 

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1 == null) {return l2;}if(l2 == null) {return l1;}if(l1.val <= l2.val) {l1.next = mergeTwoLists(l1.next,l2);//作为新的头结点return l1;}else{l2.next = mergeTwoLists(l1,l2.next);return l2;}}

4.反转链表

题目描述 

题解 

  1.  递归函数的含义:交给你⼀个链表的头指针,你帮我逆序之后,返回逆序后的头结点;
  2. 函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后⾯即可;
  3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤逆序,直接返回。

 代码实现

    public ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}

 5.Pow(x, n)

题目描述 

 

题解 

  1. 递归函数的含义:求出 x n 次⽅是多少,然后返回;
  2. 函数体:先求出 x n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x n 次⽅是多少;
  3. 递归出⼝:当 n 0 的时候,返回 1 即可。

细节问题:

  2.   -2 ^31 其中2^31就会发生越界,int 改成long类型. 

代码实现 

    public double myPow(double x, long n) {return n < 0 ? 1 / pow(x,-n) : pow(x,n);}public double pow(double x,long n) {if(n == 0) {return 1;}double tmp = myPow(x,n / 2);return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;}

 

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

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

相关文章

package.json中对peerDependencies的理解

peerDependencies只要是用来限制依赖的&#xff0c;最近在开发的时候有遇到这样的问题&#xff0c;所以研究了一下 "peerDependencies": {"vue/composition-api": "^1.0.5","vue/runtime-core": "^3.0.0","echarts&q…

【Android】Activity生命周期与五种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式singleInstancePerTask模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈&#xff08;又叫“回退栈back stack”&#xff09;中的位置决…

【ACM出版】2024年教育人工智能国际学术会议(ISAIE 2024,9月6-8)

2024年教育人工智能国际学术会议&#xff08;ISAIE 2024&#xff09;将于2024年9月6-8日在中国西安举行。本届会议由西京学院主办。 会议主要围绕人工智能在教育领域的最新研究成果展开&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

windows安装redis设置密码、修改端口、提供外部访问

windows安装redis设置密码、修改端口、提供外部访问 一、前言1. 设置密码2. 修改端口3. 允许外部访问4. 注意事项 一、前言 设置Redis在Windows上设置密码、修改端口以及允许外部访问&#xff0c;需要进行以下步骤&#xff1a; 下载地址 https://github.com/tporadowski/redi…

快速入门Jupyter notebook

快速入门 Jupyter notebook 一、前言&#xff08;一&#xff09;优点&#xff08;二&#xff09;特点&#xff08;三&#xff09;调用运行&#xff08;四&#xff09;新建 二、认识界面快捷键&#xff08;一&#xff09;三种模式&#xff08;1&#xff09;蓝色模式&#xff1a;…

中国森林地上和地下生物量碳变化数据集(2002-2021年)

中国森林地上和地下生物量碳变化数据集&#xff08;2002-2021年&#xff09; 数据介绍 为了量化中国近期全国性恢复工作的生态后果&#xff0c;过去20年森林生物量碳储量变化的空间显性信息至关重要。然而&#xff0c;在全国范围内进行长期生物量追踪仍然具有挑战性&#xff0c…

203、移除链表元素

1、题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输…

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时&#xff0c;往往会自定义一个模型类&#xff0c;这个类中定义了神经网络的结构&#xff0c;训练时将数据集输入&#xff0c;从0开始训练&#xff1b;而迁移学习中&#xff08;单指模型迁移策略&#xff09;&#x…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…

硬核科普:什么是网络准入控制系统|网络准入控制系统四大品牌介绍

网络准入控制系统&#xff08;Network Access Control, NAC&#xff09;是一种用于确保只有授权设备和用户才能接入网络的安全技术。 本文将介绍几种常用的网络准入控制系统&#xff0c;帮助您更好地了解如何选择适合您企业的NAC系统。 网络准入控制的重要性和作用 网络准入控…

java学习--练习题

在类中this.属赋值&#xff0c;则外部创建对象调用其值也会随之一样 package com.test01;/* author:我与java相爱相杀---c语言梦开始的地方 今天又是努力学习的一天&#xff01;&#xff01;&#xff01;&#xff01; */ /*1. 在Frock类中声明私有的静态属性currentNum[int类型…

idm软件最新破解版下载 idm永久激活码 IDM中文绿色特别版 idm下载器汉化版

在互联网时代&#xff0c;下载管理软件成为了我们日常使用电脑不可或缺的工具之一。说起下载工具&#xff0c;大家的第一反应可能是网盘、迅雷。但在PC端其实还有一个可以对标他们的软件——IDM&#xff0c;这是一个口碑炸裂的多线程下载工具。 Internet Download Manager&…

让你的设计更出色:10个最受欢迎的3D画图工具盘点

随着渲染工具的发生和客户对立体效果的要求越来越高&#xff0c;设计师应该能够及时用设计风格解释空间界面&#xff0c;全面使用3D画图工具进行展览设计。3D画图工具在建筑、工程、产品设计等行业使用不同的算法&#xff0c;为图像添加色调、质感等细节。不同类型的3D画图工具…

鸿蒙HarmonyOS【应用开发五、组件介绍】

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

Java之 jvm

jvm之管理内存 程序计数器&#xff1a;当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域&#xff0c;它的生命周期随着线程的创建而创建&#xff0c;随着线程的结束而死亡。Java虚拟机栈 方法调用 一个方法调用都会有对应的栈帧…

Redis - SpringDataRedis - RedisTemplate

目录 概述 创建项目 引入依赖 配置文件 测试代码 测试结果 数据序列化器 自定义RedisTemplate的序列化方式 测试报错 添加依赖后测试 存入一个 String 类型的数据 测试存入一个对象 优化 -- 手动序列化 测试存入一个Hash 总结&#xff1a; 概述 SpringData 是 S…

《Milvus Cloud向量数据库指南》——BGE-M3:多功能、多语言、多粒度的文本表示学习模型

引言 在自然语言处理(NLP)领域,随着大数据时代的到来,对文本信息的精准处理与高效检索成为了研究热点。BERT(Bidirectional Encoder Representations from Transformers)作为近年来NLP领域的里程碑式模型,以其强大的上下文理解能力在多项任务中取得了显著成效。然而,面…

刘纪鹏:“3万亿资金将股市拉升至4000点”,你能赚?

本周刘纪鹏提出了一个观点&#xff1a;花费3万亿资金将股市拉升至4000点&#xff0c;有望带来25万亿的财富增长。 3万亿的投入与25万亿的潜在增长确实令人心动。股市并非简单的投入资金就能涨&#xff0c;还需要考虑市场情绪、经济基本面等因素的影响。举个例子&#xff0c;某个…

【leetcode 详解】找出区分值(C++思路详解):这【中等】题怎么十分钟就写完了?

评价&#xff1a;就笔者的感觉吧&#xff0c;leetcode上难度标为“中等”的题目往往不是说需要什么高深的算法来解决&#xff0c;但基本都涉及到 “问题转化” 的能力要求&#xff0c;换言之&#xff0c;难点往往在于思维。 tip&#xff1a;要解决这类问题&#xff0c;笔者推荐…