03-递归

数据结构和算法
基于《算法图解》—Aditya Bhargava和《数据结构》—严蔚敏

第3章 递归

3.1 递归
假设在一堆嵌套的盒子里找钥匙,对比循环和递归。
使用循环解决:
在这里插入图片描述

#使用while循环:只要盒子堆不是空,就从中取出一个盒子,并在其中仔细查找。
def look_for_key(main_box):pile = main_box.make_a_pile_to_look_through()while pile is not empty:box = pile.grab_a_box()for item in box:if item.is_a_box():pile.append(item)elif item.is_a_key():print("found the key!")

使用递归解决:
在这里插入图片描述

#使用递归:函数调用自己
def look_for_key(box):for item in box:if item.is_a_box():look_for_key(item) #递归elif item.is_a_key():print("found the key!")

两种办法的作用相同;但递归可以让解决方案更清晰,并没有性能上的优势;使用循环的性能更好。

3.2 基线条件和递归条件

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

在这里插入图片描述

#倒计时函数
def countdown(i):print i if i <= 1:return  #基线条件else:countdown(i-1) #递归条件

3.3 栈
栈是一种简单的数据结构。具有两种操作:压入(插入)和弹出(读取并删除)。
3.3.1 调用栈(call stack)
用于存储多个函数的变量。

#定义问候函数
def greet(name):print("Hello," + name + "!")#在greet函数内调用另外两个函数greet2(name)print("getting ready to say bye...")bye()
def greet2(name):print("how are you," + name + "?")
def bye():print("ok bye!")

在这里插入图片描述

计算机为每个函数调用分配一个内存块,并使用一个栈来表示这些内存块;其中第二个内存块位于第一个内存块上面,栈顶函数调用返回后,内存块被弹出。
在这里插入图片描述

当我们调用函数greet2时,函数greet只执行了一部分:调用另一个函数时,当前函数暂时并处于未完成状态;该函数的所有变量的值都还在内存中;执行完函数greet2后,回到函数greet,并从暂时离开的地方开始接着往下执行。

3.3.2 递归调用栈

#阶乘
def fact(x):if x == 1:return 1else:return x * fact(x-1)

在这里插入图片描述
在这里插入图片描述

每个fact调用都有自己的x变量。在一个函数调用中不能访问另一个的x变量。

3.3.3 使用栈的代价
使用栈虽然方便,但存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。

3.4 小结

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

——持续修改完善中…

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

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

相关文章

linux c之提示format‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat

1、问题 有个long int data;我输出的时候printf("data is %d", data);出现下面警告 自己竟然不知道 长整型怎么打印出来&#xff0c;日了狗。 2、解决办法 md&#xff0c;m为指定的输出字段的宽度。如果数据的位数小于m&#xff0c;则左端补以空格&#xff0c;若大…

Asp.Net Core部署:早知道,还是docker!以及一点碎碎念

前言AspNetCore技术栈在我们团队里的使用也有一段时间了&#xff0c;之前的部署方式一直是本地编译之后上传可执行文件到服务器&#xff0c;使用supervisor来管理进程这种很原始的方式。参考之前的文章&#xff1a;Asp.Net Core学习笔记&#xff1a;&#xff08;五&#xff09;…

04-快速排序

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第4章 快速排序 4.1 分而治之 divide and conquer , 简称D&C&#xff1a;一种著名的递归式问题解决方法。 例子1&#xff1a; 假设你是农场主&#xff0c;有一小块土地。要求将这块地均匀地分…

android studio no marked region found along edge Found along top edge

由于种种原因&#xff0c;导致9图已经不是9图格式了&#xff0c;但是在Eclipse里面不会报错&#xff0c;在android studio 里面会报错 Error:9-patch image D:\download\avatar-android-master\avatar-android-master\sample\src\main\res\drawable-hdpi\abc_list_divider_holo…

Linux下安装compsoer ,并使用composer安装laravel

为什么80%的码农都做不了架构师&#xff1f;>>> 1、composer安装 https://getcomposer.org/download/打开composer官网。根据提示linux下可以使用php安装。 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" php -r "if (ha…

AspNetCore在docker部署时遇到一个小坑

哦吼之前刚说了尝试了使用docker来部署AspNetCore应用&#xff08;Asp.Net Core部署&#xff1a;早知道&#xff0c;还是docker!以及一点碎碎念&#xff09;&#xff0c;结果这才刚上班就遇到问题了 …我这项目用的数据库是Oracle&#xff0c;之前直接运行没啥问题&#xff0c;…

05-散列表

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第5章 散列表 假设你在一家杂货店上班。有顾客来买东西时&#xff0c;你得到一个本子中查找价格。如果本子的内容不是按字母顺序来排序的&#xff0c;你可能为查找苹果价格而浏览每一页&#xff0c…

疯狂ios讲义疯狂连载之实现游戏逻辑(2)

13.6.5 定义获取通道的工具方法这里所谓的通道指的是一个方块上、下、左、右4个方向上的空白方块图13.10显示了一个方块四周的通道。图13.10 方块四周的通道下面是获取某个坐标点四周通道的4个方法。程序清单codes/13/Link/Link/sources/board/FKGameService.m13.6.6 没有转折点…

linux之进程间通信--使用信号

一、什么是信号用过Windows的我们都知道&#xff0c;当我们无法正常结束一个程序时&#xff0c;可以用任务管理器强制结束这个进程&#xff0c;但这其实是怎么实现的呢&#xff1f;同样的功能在Linux上是通过生成信号和捕获信号来实现的&#xff0c;运行中的进程捕获到这个信号…

解决Maven工程中报 Missing artifact jdk.tools:jdk.tools

2019独角兽企业重金招聘Python工程师标准>>> 解决方法&#xff1a; 在pom.xml中添加如下依赖&#xff1a; <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>…

回到地球之后,这个男人创建了Ubuntu

文 | 大东出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;2002 年&#xff0c;莫斯科当地时间 4 月 25 日 9 时 26 分&#xff0c;满载着补给和 3 名宇航员的“联盟-TM 号”航天飞船在“联盟 U”火箭的推进下飞往国际空间站。同行的三人中&#xff0c;年…

Hadoop完全分子式环境搭建—问题及解决办法

Hadoop完全分布式环境搭建 ps:本人是按照尚硅谷的教程搭建的&#xff0c;版本hadoop2.7&#xff0c;centos版本6&#xff0c;一台主机&#xff0c;两台从机。 一&#xff0e;版本问题 1.尽量使用hadoop版本2&#xff0c;尽量不要使用最新版本3。因为会出现无法解决的问题&…

POJ 2135 最小费用最大流

思路&#xff1a; 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 2010 #def…

06-广度优先搜索:图、队列

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第6章广度优先搜索 6.1 简介 广度优先搜索—breadth-first search&#xff0c;BFS. 主要内容图和队列。 广度优先搜索能让你能够找出两样东西之间的最短距离&#xff0c;比如&#xff1a;编写国际跳…

虎年云原生落地技术趋势

今天是立春&#xff0c;虎年第一天。去年我写过一篇 牛年 dotnet云原生技术趋势[1]&#xff0c;今天再来写一篇虎年云原生落地技术趋势&#xff0c;去年局限在.NET 平台上的云原生落地&#xff0c;我今年在去年探索云原生落地的基础上从多语言云原生技术落地的趋势来谈谈。在 2…

WdatePicker 设置日期第一个比第二个的日期小

WdatePicker 设置日期第一个比第二个的日期小 可以设置&#xff0c;日期只显示某一天的&#xff0c;比如只显示周一&#xff0c;和周日 <input id"Text1" class"Wdate" onFocus"WdatePicker({disabledDays:[0,2,3,4,5,6],maxDate:#F{$dp.$D(\Text2…

07-狄克斯特拉算法

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第7章 狄克斯特拉算法 上一章的广度优先搜索&#xff0c;找出的是段数最少的路径&#xff1b; 本章狄克斯特拉算法&#xff0c;找出的是最快的路径。 7.1 使用狄克斯特拉算法 步骤&#xff1a; 第…

聊聊mysql执行过程

在项目开发当中 &#xff0c;很多时候&#xff0c;我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 &#xff0c;我们的优化方向大多时候都是先看方法执行的时间长短&#xff0c;然后再决定是否去优化它&#xff0c;下意识的第一步操作都是看是否命中索引…

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫&#xff0c;关注微信公众号【数据与算法联盟】 转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer前言 由于业务关系&#xff0c;最近一段时间一直在…