学习递归

算法之递归

递归思想

递归就是函数自己调用自己,会使代码逻辑很清晰,但是Stack Overflow上有说的一句话:“如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。

很多排序算法都用到了递归,例如快速排序,归并排序等,具体排序算法代码参考我之前写的博客python实现常见排序算法

基线条件和递归条件

基线条件

递归必须有一个终止条件,避免形成无线循环,这个条件就叫做基线条件。
举例一般都是一些特殊情况,比如快排时的列表是空列表或者只有一个元素就不需要排序就退出函数即可,这就是基线条件

递归条件

指的是函数自己调用自己
简单的例子

def countdown(i):print(i,end=',')if i <= 0: # 基线条件returnelse: # 递归条件countdown(i-1)
countdown(3) # ==> 3,2,1,0,

简单说一下栈:类似枪的弹夹,只能压入子弹(插入数据),弹出子弹(删除并读取),子弹只能后先压入的最后出来(first in last out)。

调用栈(call stack)

计算机在内部使用被称为调用栈的栈
函数举例

def greet(name):print 'hello' + name + '!'greet2(name)  # 调用hello2进行问候print 'getting ready to say bye...'bye() # 调用bye进行拜拜def hello(name):print 'Have you eaten yet, '+ namedef bye()print 'ok, bye'

内存角度介绍上述函数hello被调用后的计算机处理过程
调用hello计算机分配空间给这个函数存储函数名和name=maggie,这里给命个名叫greet内存块
hello内部调用了hello2,同上,计算机一样分配的内存给他,叫greet2内存块
如下图,打印Have you eaten yet miggie后调用的函数被返回,此时greet2内存块倍弹出。
调用栈1
hello内部调用了bye,同上,计算机一样分配的内存给他,叫bye内存块
bye内存块进来又压在了greet内存快上,打印完ok,bye后又弹出了
然后整个函数结束,greet内存块也被弹出
这个栈用于存储多个函数的变量被称为调用栈

递归调用栈

递归函数也使用调用栈,直接看代码

def fact(x): # jiecheng(3)--> 3! = 3 * 2 * 1 求出3的阶乘if x == 1:return 1return x * fact(x-1)

递归函数
有三个fact的调用,等fact(1)调用结束被弹出,依次弹出,注意每个fact调用都有自己的x变量,在一个函数调用中不能访问领一个的x变量。
这个栈包含了未完成的函数调用。
缺点:使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调
用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。在这种情况
下,有两种选择。

  • 重新编写代码,转而使用循环。
  • 使用尾递归。这里不讨论,感兴趣可以去查。

小结

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

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

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

相关文章

CoreAnimation编程指南(三)几何变换

本章介绍图层的几何组成部分&#xff0c;及他们之间的相互关&#xff0c;同时介绍如何变换矩阵可以产生复杂的视觉效果。一、图层的坐标系1.图层的坐标系在不同平台上面具有差异性。在iOS系统中&#xff0c;默认的坐标系统原点在图层的中心左上角地方&#xff0c;原点向右和向下…

队列和栈

栈 一张图可以简单的说明 为了达到时间复杂度最低&#xff1a;选择的是python列表实现栈&#xff0c;而列表是顺序表 入栈push的时候选择在列表的尾部进行添加元素&#xff0c;出栈在列表尾部弹出 class Stack(object):"""栈"""def __init__(…

CoreAnimation编程指南(四)图层树结构

图层不但给自己提供可视化的内容和管理动画&#xff0c;而且充当了其他图层的容器类&#xff0c;构建图层层次结构。 本章介绍了图层层次结构&#xff0c;以及如何操纵该图层层次结构。一、什么是图层树的层次结构1.图层树是核心动画里面类似Cocoa视图的层次结构。比如一个NSVi…

学习散列表

回顾一下简单查找和二分查找 杂货店商品对应的价格举例&#xff1a; 简单查找就是拿出商品价目本&#xff0c;这个价目本并不是有序的&#xff0c;顾客问苹果多少钱&#xff0c;需要一个一个去查找某一个商品的价格&#xff0c;需要O(n)时间。 同样是一个价目本&#xff0c;但…

CoreAnimation编程指南(五)图层内容

当我们使用Cocoa的视图的时候&#xff0c;我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容。但是CALayer实例可以直接使用&#xff0c;而无需继承子类。因为CALayer是一个键-值编码兼容的容器类&#xff0c;你可以在实例里面存储任意值&#xff0c;所以子类实…

SHA算法

回顾散列算法 我的上篇文章&#xff1a;学习散列表 在上篇文章杂货铺的示例中&#xff0c;我们希望散列函数的结果是均匀分布的。散列函数接受一个字符串&#xff0c;并返回一 个索引号。 安全散列算法&#xff08;secure hash algorithm&#xff0c; SHA&#xff09;函数 给…

CoreAnimation编程指南(六)动画

动画是当今用户界面的关键因素。当使用核心动画的时候&#xff0c;动画是自动完成的。没有动画的循环和计数器。你的应用程序不负负责重绘&#xff0c;也不负责跟踪动画的当前状态。动画在独立线程里面自动执行&#xff0c;没有和你的应用程序交互。本章提供了对动画类的概览&a…

CoreAnimation编程指南(七)图层Action

图层的行为在以下情况发生的时候被触发&#xff1a;从图层树里面插入或者删除一个图层&#xff0c;图层的属性值被修改了&#xff0c;或者程序显式要求。通常情况下&#xff0c;行为触发器是动画显示的结果所在。1.1 行为对象的角色一个行为对象是一个通过CAAction协议响应行为…

python实现搜索之二分查找

搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的&#xff0c;因为该项目是否存在。 搜索的几种常见方法&#xff1a;顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找&#xff0c;优点是比较次数少&#x…

CoreAnimation编程指南(八)事务

图层的每个改变都是事务的一部分。CATransaction是核心动画类&#xff0c;它负责成批的把多个图层树的修改作为一个原子更新到渲染树。本章介绍了核心动画支持的两种事务。隐式事务和显式事务。1.1 隐式事务当图层树被没有获得事务的线程修改的时候将会自动创建隐式事务&#x…

写SQL语句需要注意的点

先回忆一下DDL和DML 创建表DDL create table t_xx(id int auto_increment primary key, name char(10),...) create table t_student( id int auto_increment primary key , name char(10), 外键id int, foreign key(外键id) references 外表t_class(外表id字段名) );插入数…

CoreAnimation编程指南(九)图层布局

NSView提供了经典的“stuts and springs”模式&#xff0c;用于视图调整大小的时候把关联到它父图层的视图重新调整位置。图层支持该模式&#xff0c;而且Mac OS X上面的核心动画提供了一个更通用的布局管理器机制&#xff0c;允许开发者自己写他们自己的布局管理器。可以为图层…

数据库优化、数据库基础等常用知识点总结

建表优化 1&#xff09;数据库范式 第一范式&#xff08;1NF&#xff09;&#xff1a;强调的是列的原子性&#xff0c;即列不能够再分成其他几列。 如电话列可进行拆分—家庭电话、公司电话第二范式&#xff08;2NF&#xff09;&#xff1a;首先是 1NF&#xff0c;另外包含两…

CoreAnimation编程指南(十)KVC

CAAnimation和CALayer类扩展了NSKeyValueCoding协议&#xff0c;给键添加默认值&#xff0c;扩展了封装协议&#xff0c;支持CGPoint、CGRect、CGSize和CATransform3D关键路径。1.1 键-值编码兼容的容器类CALayer和CAAnimation都是键-值编码兼容的容器类&#xff0c;允许你修改…

CoreImage使用介绍

一、概述CoreImage.framework从iOS5开始启用&#xff0c;它使我们很容易就能处理图片的各种效果&#xff0c;色彩&#xff0c;曝光&#xff0c;饱和度&#xff0c;变形等等。不仅功能强大&#xff0c;而且可以直接使用GPU&#xff0c;效率很高&#xff0c;甚至可以实时的对视频…

一片文章概括大部分python面试基础常考题(部分有详解)

本片文章部分参考地址&#xff1a;https://segmentfault.com/a/1190000018737045 python是动态解释性的强类型定义语言 强类型&#xff1a;不允许不同类型相加。例如&#xff1a;整形字符串会报类型错误。 动态&#xff1a;不使用显示数据类型声明&#xff0c;且确定一个变量…

AssetsLibrary使用介绍

一、概述AssetsLibrary框架&#xff1a;从iOS4.0开始提供&#xff0c;可以通过它获取设备里的图片和视频等资料&#xff0c;以API的方式提供&#xff0c;而且界面式的&#xff0c;比UIImagePickerViewController灵活很多。既可以读又可以写。二、读取资料库中的全部资料1.大概步…

Objective-C成员变量声明方式探究

一、interface和 property 方式声明变量的区别1.你可以单独在interface中定义变量&#xff0c;而不用property定义&#xff1b;也可以只用property去定义&#xff0c;而不在interface中定义&#xff0c;当然用了property去定义&#xff0c;一般要在.m文件中用synthsize去合成相…

web处理高并发措施

高并发处理的思路&#xff0c;从几个方面进行解决 先来了解几个名词 QPS: 每秒处理的请求数量&#xff01; 响应时间: 处理一个请求需要的时间&#xff01; 吞吐量: 单位时间内的处理请求数量&#xff01; 最大并发数: 同一时间能支持的最大请求数&#xff01; 1、流量处…

经典逻辑编程题(本文用python实现)

在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数。 思…