算法图解学习4 递归

news2025/8/7 3:49:29

random recording 随心记录
What seems to us as bitter trials are often blessings in disguise.
看起来对我们痛苦的试炼,常常是伪装起来的好运。

递归

背景导入

在一个盒中盒找钥匙
第一种实现方法,如下图第
第二种方法,如图
在这里插入图片描述

两种方法伪代码实现

第一种,递归

# 第一种 递归 伪代码
def look_for_key(box):
    for item in box:
        if item.is_box():
            look_for_key(item)
        else:
            print("找到钥匙")

第二种,while循环

# 第二种 while循环 伪代码
def look_for_key(box):
    pile = box.make_pile_to_look_through()
    while pile is not empty:
        b = pile.grap_box()
        for item in b:
            if item.is_box():
                pile.append(item)
            else:
                print("找到")

极限条件和递归条件

编写递归函数时,必须告诉它何时停止递归。正因为如此,每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。

计数方法示例

def count_num(n):
    if n < 0: # 基线条件
        return
    print(n)
    return count_num(n-1) # 递归条件
count_num(10)

在这里插入图片描述

引入

假设你去野外烧烤,并为此创建了一个待办事项清单——一叠便条。对比之前的数组和链表实现待办清单,一叠便条要简单得多:插入的待办事项放在清单的最前面;读取待办事项时,你只读取最上面的那个,并将其删除。因此这个待办事项清单只有两种操作:压入(插入)和弹出(删除并读取),这种数据结构称为栈。
在这里插入图片描述

调用栈(call stack)

函数调用栈

# 函数调用栈
def greet(name):
    print('hello,'+name+'!')
    greet2(name)
    print('ready to say -bye')
    bye()
def greet2(name):
    print('how are you,'+name)
def bye():
    print('bye~')
greet('kangkang')

以上计算机内部实现过程
先调用greet方法,计算机为该方法分配内存,变量名kangkang,被存储到内存中,每次调用方法都执行该操作。
在这里插入图片描述
然后执行print,打印 hello,kangkang!接下来,调用greet2方法,并分配第二块内存,置于greet方法内存之上,执行greet2内部print,打印 how are you,kangkang,最后,销毁第二块内存调用。
在这里插入图片描述
同样,继续调用bye方法,分配内存,置于greet方法内存之上,执行内部print,打印bye~,销毁此内存,最后再销毁greet内存。

在这里插入图片描述
以上过程就是函数调用栈实现,分配和销毁内存对应压栈和出栈操作,是一种先进后出的数据结构。

递归调用栈

阶乘方法

def factorial(n):
    if n == 1:
        return 1
    return n*factorial(n-1)
print(factorial(5))

图解调用过程:
在这里插入图片描述
在这里插入图片描述

使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。在这种情况下,有两种选择:
重新编写代码,转而使用循环。
使用尾递归。

小结

  • 递归指的是调用自己的函数。
  • 每个递归函数都有两个条件:基线条件和递归条件。
  • 栈有两种操作:压入和弹出。
  • 所有函数调用都进入调用栈。
  • 调用栈可能很长,这将占用大量的内存。

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

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

相关文章

6.jQuery中的Ajax上传文件

目录 1 上传文件 2 loading效果 1 上传文件 后端接到数据后保存在upload_file文件夹下 前端依然使用FormData处理文件 contentType:false的意思是 使用FormData默认的Content-Type值 processData:false的意思是 不对FormData中的数据进行url编码&#xff0c;而是将Form…

与专业安全厂商相比,戴尔做安全的优势是什么?

上文介绍了戴尔大谈零信任架构的原因&#xff0c;也提到了现代安全的三大要素&#xff0c;分别为&#xff1a;信任的基础、简化的零信任采纳和网络恢复计划。事实上&#xff0c;戴尔作为全球大型IT基础设施提供商&#xff0c;能提供多种网络安全能力来构建现代安全&#xff0c;…

当你碰到了MySQL中的死锁,你了解这些机制吗?

MySQL死锁怎么来的&#xff1f; 当两个及以上的事务&#xff0c;双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源&#xff0c;就会出现“死锁”。 总结一下生产死锁的4个条件&#xff1a; 两个或者两个以上事务 每个事务都已经持有锁并且申请新的锁…

[附源码]java毕业设计游戏战队考核系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Baklib帮助中心:自助服务指南

根据 Social endurance 的调查&#xff0c;64%的客户希望在 Twitter 上发帖一小时内得到回复&#xff0c;85%的客户希望公司在6小时内回复。 虽然这种客户期望的趋势几乎适用于所有行业&#xff0c;但某些行业——如电子商务应用程序——的流量正创下历史新高。大多数公司可能…

如何在矩池云上安装语音识别模型 Whisper

如何在矩池云上安装语音识别模型 Whisper Whisper 是 OpenAI 近期开源的一个语音识别的模型&#xff0c;研究人员基于 680,000 小时的标记音频数据进行训练&#xff0c;它同时也是一个多任务模型&#xff0c;可以进行多语言语音识别以及语音翻译任务&#xff0c;可以将语音音频…

【CVPR 2022】QueryDet:加速高分辨率小目标检测

大连不负众望&#xff0c;疫情了&#xff0c;我们又封校了&#xff0c;可能初步封个5678天&#xff0c;微笑jpg 论文地址&#xff1a;https://arxiv.org/pdf/2103.09136.pdf 项目地址&#xff1a;https://github.com/ ChenhongyiYang/QueryDet-PyTorch 1. 简介 背景&#xf…

java中的线程池

文章目录前言线程池的优点线程池的实现原理线程池的创建线程池提交任务线程池的关闭合理配置线程池线程池的监控总结前言 在处理一些比较复杂或者费时的任务的时候&#xff0c;我们常常会选择多线程的方式去处理。那么怎么创建多个线程呢&#xff0c;当然不可能是一个一个创建…

微信如何制作自己的小程序【微信小程序】

小程序在微信的生态中&#xff0c;一直是比较受到企业商家的欢迎&#xff0c; 由于小程序的制作门槛比较低&#xff0c;开发人员可以根据自己喜欢的风格进行定制开发。 微信平台上&#xff0c;很多商家都在为制作小程序而发愁。那么微信如何制作自己的小程序呢&#xff1f; 一…

[附源码]java毕业设计疫情期间物资分派管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ebay卖家开店如何做到稳定出单?自养号测评对eBay卖家有什么优势?

ebay卖家开店如何做到稳定出单&#xff0c;有何方法。 1、上架 ebay新账户快速下单的方式是拍卖&#xff0c;但拍卖价格不稳定&#xff0c;可能会让商家赔钱。为了快速打开新账户的局面&#xff0c;商家不妨在早期阶段开始拍卖&#xff0c;因为拍卖是最能驱动流量的。请注意&…

中国互联网众筹行业

近些年&#xff0c;中国互联网发展迅速&#xff0c;众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下&#xff0c;这种低门槛的融资模式也深受欢迎&#xff0c;加上阿里、京东、苏宁三大电商的巨头的相继入场&#xff0c;更令这…

HDC2022的无障碍参会体验,手语服务是如何做到的?

华为开发者大会2022&#xff08;HDC&#xff09;上&#xff0c;HMS Core手语数字人以全新形象亮相&#xff0c;并在直播中完成了长达3个多小时的实时手语翻译&#xff0c;向线上线下超过一千万的观众提供了专业、实时、准确的手语翻译服务&#xff0c;为听障人士提供了无障碍参…

组播技术→

基本概念 224.0.0.0-239.255.255.255 组播IP地址是D类。 224.0.0.0-224.0.0.255 本地网络使用,不进行路由转发。 232.0.0.0–232.255.255.255为特定源组播地址 组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。 组播协议 组播通信四要素 源发现…

【SpringBoot 】策略模式 之 一键切换文件上传方式

&#x1f3b6; 文章简介&#xff1a;【SpringBoot 】策略模式 之 一键切换文件上传方式 &#x1f4a1; 创作目的&#xff1a;将策略模式的思想融入到java编码中&#xff0c;更加便捷的实现文件上传方式的切换。阿里云Oss对象存储、腾讯云Cos对象存储、七牛云Kodo对象存储以及本…

swift指针内存管理-闭包的循环引用

swift指针&内存管理-引用 无主引用 和弱引用类似&#xff0c;无主引用不会牢牢保持引用的实例。但是不像弱应用&#xff0c;无主引用假定是永远有值的 当我们去访问一个无主引用的时候&#xff0c;总是假定有值的&#xff0c;所以就可能会发生程序的崩溃 如果两个对象的…

单片机的调试接口 JTAG SWD

JTAG-DP 和 SW-DP DP&#xff1f;debug port SW serial wire PA13 JTMS SWDIO ------JTAG 模式选择引脚&#xff08;JTMS&#xff09; PA14 JTCK SWCLK ------JTAG时钟引脚&#xff08;JTCK&#xff09; PA15 JTDI ------JTAG 数据输入引脚&#xff08;JTDI&#xff09; PB3 J…

基于VitePress创建组件文档

我们准备用vitepress做我们的组件文档&#xff0c;方便我们浏览组件&#xff0c;提供使用指南给用户。 安装VitePress 安装&#xff1a; yarn add -D vitepress创建第一个文档&#xff1a; mkdir docs && echo # Hello VitePress > docs/index.md增加脚本命令&a…

十大跑步运动耳机品牌排行榜,值得推荐的六款运动耳机

除了工作时间&#xff0c;大多数人群都喜欢去运动健身&#xff0c;戴着耳机放着喜爱的音乐&#xff0c;慢跑在城市的每个角落里&#xff0c;看着各种事物&#xff0c;悠然自得释放压力的同时还能更加有动力去运动&#xff0c;不得不说&#xff0c;运动确实能够让我们暂时忘却烦…

算法训练Day28 | LeetCode93.复原IP地址(回溯算法中的切割问题2);78 子集(每个节点都收集结果);90.子集II(子集问题+去重)

前言&#xff1a;算法训练系列是做《代码随想录》一刷&#xff0c;个人的学习笔记和详细的解题思路&#xff0c;总共会有60篇博客来记录&#xff0c;记录结构上分为 思路&#xff0c;代码实现&#xff0c;复杂度分析&#xff0c;思考和收获&#xff0c;四个方面。如果这个系列的…