【追求卓越06】算法--递归

引导

        递归算法算是我们比较常用的一种算法。但是想用好并不简单。本章我不再介绍简单的概念,主要讲解递归算法的优缺点和如何用递归写代码。

个人爱好

其实相对于使用while循环,我更喜欢使用递归算法。为什么呢?

  • 使用递归算法代码往往会变得更加简洁,特别当其他人使用whilefor等几十行代码实现功能,而你仅仅需要几行代码。就特别有一种自豪感。
  • 递归算法,我觉得对思维的逻辑性要求更高,递归算法常常会把人带入思维误区,脑袋一场混杂
    以上是我个人喜欢使用递归的主要原因。

但是递归算法也存在很多的弊端:

  1. 栈溢出。我们知道函数参数和局部变量都是保存在栈中的,并且每个线程的栈空间默认大小为8M。
  2. 空间复杂度高。和栈溢出的道理一样
  3. 重复计算。这个要视具体的问题了,可能会出现重复计算的现象
  4. 过多的函数调用会耗时较多。我们知道函数调用的过程会有额外的时间消耗在上下文保存中。当递归层次很深的时候,就会是一个很客观的时间消耗。

如何解决这些弊端?

其中1,3,4我们可以通过控制的递归层次来进行控制,如:

int deep = 0
f(n)
{
    deep++;
    /
*规定最多递归100层*
/
    if(deep > 100)
    {
        return;
    }
    f(n-1);
}

        关于重复计算,我们可以通过使用hash表来进行处理。将f(m)的结果进行hash保存,在处理f(n)时,现在hash表中查看是否存在该value。

如何使用递归?

        递归说简单也简单,说难也很难。简单就是将问题能够分为子问题和找到终止条件即可。困难在于如何从一个具体的问题中,分析出这两个条件

        比如教科书上利用递归计算阶乘值,这些很简单。因为你能够很容易分析出问题分为子问题和终止条件。

        但是如果你要使用递归处理下面的问题,你可以很快的给出结果吗?合并两条有序链表。可以在链表练习题中找点思路。【追求卓越03】数据结构--链表练习题-CSDN博客

        其实,我觉得想要熟练掌握好递归,你要多练,多做题,多思考。这样你才能对一个具体的问题,分析出递归公式以及终止条件。

        仅仅通过他人三言两语给你分析,你是很难得到进步。别人能够很快的分析出来,那是人家经过了大量的练习。这点要注意哦!!!

总结

        本节,我们主要介绍了大家熟知的递归算法以及它存在的一些问题:栈溢出,空间复杂度高,函数调用耗时多,以及对应的解决方式。

        写递归的方式:找到递归公式终止条件。再转化为代码。并且只有大量练习,才能熟练掌握递归算法。

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

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

相关文章

Java语言中的控制流程

控制流程是编程中的重要概念之一,它允许程序根据条件执行不同的代码块或重复执行特定的代码块。在Java中,控制流程由条件语句和循环语句组成。本文将详细介绍Java中的条件语句(if语句和switch语句)和循环语句(for循环、…

MySQL用户与权限管理

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) MySQL用户与权限管理 登录 #本地登录 mysql -uroot -p123456#远程登录 #客户端语法:mysql -…

聚观早报 |快手Q3营收;拼多多杀入大模型;Redmi K70E开启预约

【聚观365】11月23日消息 快手Q3营收 拼多多杀入大模型 Redmi K70E开启预约 华为nova 12系列或下周发布 亚马逊启动“AI就绪”新计划 快手Q3营收 财报显示,快手第三季度营收279亿元,同比增长20.8%;期内盈利21.8亿元,去年同期…

猫罐头多久喂一次?好用的猫罐头牌子推荐

猫爱吃猫罐头,包含各种美味,提供营养和口感。但喂猫吃罐头需技巧和耐心,以确保猫健康快乐成长。 作为一个从业宠物营养师7年的人,可以说对于猫咪的食物很有研究和猫罐头品牌选购上,我有自己的见解。 一、猫罐头多久喂…

shell之wc命令

shell之wc命令 Linux中的wc命令是一个用于统计给定文件中的字节数、字数和行数的工具。它也可以从标准输入读取数据并统计。 wc命令的语法为: wc [选项] 文件... 如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。wc命令的选…

40、Flink 的Apache Kafka connector(kafka source 和sink 说明及使用示例) 完整版

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

循环神经网络(RNN)实现股票预测

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据 四、数据预处理1.归一化2.设置测试集训练集 五、构建模型六、激活模型七、训练模型八、结果可视化1.绘制loss图2.预测3.评估 一、前言 我的环境: 语言环…

【Rust】快速教程——一直在单行显示打印、输入、文件读写

前言 恨不过是七情六欲的一种,再强大的恨也没法独占整颗心,总有其它情感隐藏在心底深处,说不定在什么时候就会掀起滔天巨浪。——《死人经》 图中是Starship扔掉下面的燃料罐,再扔掉头顶的翅膀后,再翻转过来着陆火星的…

Andorid : Toast(弹出框)- 简单应用

Toast Android官方在Android API 30版本(或更高版本)之后即对该方法不生效。 只要SDK版本低于30,Toast.setGravity()方法即可生效 MainActivity.java package com.example.mytoast;import androidx.appcompat.app.AppCompatActivity;import android.content.Cont…

[C++ 从入门到精通] 13.派生类、调用顺序、继承方式、函数遮蔽

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

SOEM主站开发篇(2):添加SOEM主站APP程序

0 工具准备 1.SOEM-1.4.0源码(官网:http://openethercatsociety.github.io/) 2.Linux开发板(本文为正点原子I.MX6U ALPHA开发板) 3.交叉编译工具(arm-linux-gnueabihf-gcc) 4.cmake(版本不得低于3.9,本文为3.9.2) 5.Ubuntu 16.04(用于编译生成Linux开发板的可执行文…

【Unity细节】Default clip could not be found in attached animations list.(动画机报错)

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

生产制造业如何谋求数字化转型?需要哪些信息化系统做支撑?

生产制造业的数字化转型是将数字系统和各种技术整合到传统制造流程中的过程,这将导致行业格局的重大变革。工业4.0的到来为制造业开创了一个新时代,制造商可以简化生产线,提高整体效率。同时,这一技术革命使他们能够收集到大量的数…

计算机网络实用工具之tcpdump

简介 tcpdump是一个运行在命令行下的数据包分析器。能够获取到该计算机发送或接收的TCP/IP和其他数据包。 tcpdump 适用于大多数的类Unix操作系统,包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在这些系统中,tcpdump 需要使用libpcap这个捕捉…

Altium Designer学习笔记9

忽视了一个最大的问题,就是元器件的封装,不应该是根据AD系统的封装走,而应该是根据立创商城上的规格书,确认每个封装的大小,画出封装图,然后才是布局和走线。 1、确认电容的封装采用0805,贴片电…

【css】Google第三方登录按钮样式修改

文章目录 场景前置准备修改样式官方属性修改样式CSS修改样式按钮的高度height和border-radiusLogo和文字布局 场景 需要用到谷歌的第三方登录,登录按钮有自己的样式。根据官方文档:概览 | Authentication | Google for Developers,提供两种第…

局域网协议:地址解析协议(ARP,Address Resolution Protocol)

地址解析协议(ARP,Address Resolution Protocol)是一种用于在IP网络中将IP地址映射到物理MAC地址的协议。在IP网络中,IP是用于寻址,真正将数据包从一个设备发送到另外一个设备,用于通信的是物理MAC地址。 …

40、Flink 的Apache Kafka connector(kafka sink的介绍及使用示例)-2

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

geemap学习笔记012:如何搜索Earth Engine Python脚本

前言 本节主要是介绍如何查询Earth Engine中已经集成好的Python脚本案例。 1 导入库 !pip install geemap #安装geemap库 import ee import geemap2 搜索Earth Engine Python脚本 很简单,只需要一行代码。 geemap.ee_search()使用方法 后记 大家如果有问题需…

vue截取URL中的参数

url: http://localhost:81/login?redirect%2Findex&access_tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvdUV4dGVybmFsSWQiOiI0OTI2MjYzMTIxMDU1NDAxMTM4IiwiYXVkIjpbImVudGVycHJpc2VfbW9iaWxlX3Jlc291cmNlIiwiYmZmX2FwaV9yZXN 截取参数: let…