自己动手写cpu 光盘_自己动手写CPU配套源码

自己动手写CPU的源代码,一共15章,可以完整实现MIPS的指令

文件:n459.com/file/25127180-476886294

以下内容无关:

-------------------------------------------分割线---------------------------------------------

目录

  • 一、往期回顾
    • 1.生成器代码详解
    • 2.生成器的三个方法
  • 二、递归函数
    • 1.什么是递归函数
    • 2.递归函数调用原理图
    • 3.递归边界
    • 4.通过递归函数实现的任意数的阶乘
    • 5.这个递归函数的递归临界点在哪?
    • 6.斐波那契数列
  • 三、系列推荐

一、往期回顾

1.生成器代码详解

def gen():for i in range(5):j = yield iprint(j)# send:与生成器进行交互
g = gen()print(next(g))
print(next(g))

a00d8d8f4d2f27b97b14cba97fb276bf.png

第一个print(next(g))打印的 0,就是生成器生成的元素。第二个print(next(g))打印的 1 也是生成器生成的元素,None 是print(j)打印的j

通过生成器获取元素的时候,首先生成器进去的话,当调用生成器获取里面的值,它会从上往下走,走到j = yield i这里,把yield这里的i这个值返回出来,调用完gen()返回一个生成器g

通过这个生成器next(g)去拿值的时候,然后它从上往下执行代码,走到j = yield i这里,yield相当于把i,通过yield返回出去。

从生成器里面返回出来,就生成一个数据。生成这个i,到第一个print(next(g))这里,打印的就是i

第二个print(next(g)),再用next()调用生成器的时候,那么这个生成器会从yield之后继续往下执行。

通过next()去触发生成器的时候,yield之后是没有内容的,j接收的就是空的,所以打印j的时候,打印出来的是个None

2.生成器的三个方法

# 生成器的三个方法: send  close  throwdef gen():for i in range(5):j = yield iprint(j)# send:与生成器进行交互
g = gen()print(g.send(100))
print(next(g))
print(next(g))

运行后报错:

b484782e2d5ddbce68015fd5d5ab3f3b.png

生成器的send()方法,它运行的时候会从上一个yield结束的地方来进行运行。

在这里只创建了gen()这个生成器,这个生成器还没有生成过任何数据,这个时候生成器就暂停在函数最开始的地方def gen():这里。

这里send(100)这个值进去的话,在这里运行,直接运行for i in range(5):这个语句,send(100)生成进去的这个值没有地方接收,所以报错了。

send()必须在调用了一次next()之后才调用。可以和next()一样,去获取生成器里面的内容。

2.1next()获取生成器里面的内容:

# 生成器的三个方法: send  close  throwdef gen():for i in range(5):j = yield iprint(j)# send:与生成器进行交互
g = gen()print(next(g))
print(next(g))
# print(g.send(100))

e2e480dde292665ab887f61f96ff8dde.png

2.2send()在调用了一次next()之后调用,获取生成器里面的内容:

# 生成器的三个方法: send  close  throwdef gen():for i in range(5):j = yield iprint(j)# send:与生成器进行交互
g = gen()print(next(g))
print(g.send(100))
# print(next(g))

040aa9a99668f4a3aac936f4ca904cff.png

yield只能在函数里面用。yield关键字是用在创建生成器的时候,只要函数里面使用了yield关键字,在调用函数的时候,函数不会立马被执行。

因为这个函数不是简单的函数了,它是个生成器。

在函数外面,是没办法用yield关键字的。

abcb1a302c6ed3c0753a2f2155796452.png

2.3close():关闭生成器

def gen():for i in range(5):j = yield iprint(j)yield 100# send:与生成器进行交互
g = gen()print(next(g))
# print(next(g))
# print(g.send(100))# close:关闭生成器
g.close()
print(next(g))

a7b97b42c2c8f9e66e40eef1791fc272.png

2.4throw()方法:在生成器内部主动引发一个异常。参数:1.异常类型。2.异常信息。

这个方法可以接收 2 个参数,第一个参数:Exception 异常类型。第二个参数:传入异常的信息。

Exception 报错:

g.throw(Exception,"Method throw called!")

9d3dd646b1868a585a8d1b619f577210.png

ValueError:

g.throw(ValueError,"清菡,大事不好,报错了,嘤嘤嘤~")

7dc6eddf6993aa3f8f2fd631b4eb57aa.png

二、递归函数

1.什么是递归函数

在函数中调用函数自身,我们把这样的函数叫做递归函数。

2.递归函数调用原理图

693e66a3ff705cdabbcef1d4d29e1874.png

3.递归边界

递归边界:退出递归的终止条件。

def func():print('99999')func()func()

1042daee86ed908663445e418b9143af.png

在外面调用函数,直接陷入一个死循环。在函数内部调用func()这个函数,又到def func():这里来执行,然后print('99999'),又func()调用。

不断得自身调用,这样就造成了死循环。

aee087bf3a8fa3d30eafd727b4bf63db.png

Pycharm 有个检测机制: 当它内部检测到这个是个无限递归,没有递归临界点的一个递归函数,那么这个时候,它递归多少次之后,会自动给终止了。

使用递归函数的时候,一定要注意一个点:就是一定要设置递归的边界。递归的边界就是递归函数的终止条件。

如果你不设置递归边界,那么你定义的递归函数就是个死循环,一直无限得调用自身。

4.通过递归函数实现的任意数的阶乘

4.1 什么是阶乘?

1 的阶乘1

递归能实现的,通过循环都能实现。

Python 中递归用得不多,不太建议使用递归,因为递归不太好用,用递归还不如用循环。

4.2 怎么去算阶乘呢?

定义个函数,算任意数的阶乘。传 1,就算 1 的阶乘,传 10 就算 10 的阶乘。

可以这样做:

首先要判断下它传进来的这个参数是不是等于 1,如果是等于 1 的话,就直接给它return返回出去。然后,如果它不等于 1 的话,就返回return n * (n-1)*(n-2)

n 传进来是 1,那应该返回 1;如果传的是 2,应该返回return n * (n-1)

d6748c50823a58fd6bedfae414a6a768.png

如果在这里用递归函数,调用func(1)。那么这个时候,这个func(1)调用递归函数。

这个函数返回的是什么?

调用这段代码:

if n == 1:return 1

返回的是个 1。

将代码修改成如下:

def fun(n):if n == 1:return 1else:return n * fun(n-1)fun(3)

如果是fun(3),3 传进来:

def fun(n):if n == 1:return 1

肯定是不成立的。

else后面的代码return n * fun(n-1)

这里的 n 是个 3,fun(n-1)就是fun(2),那么就是3 * fun(2)

这个时候会再次调用自身这个函数:

ce99fe51f0d62f75db20e6cc8607d903.png

这个时候 n 是什么?

fun(2)的时候 n 是个 2,就是3 *2* fun(1)fun(1)再执行下,出来的结果是个 1。那这里就是个 1,就是3*2*1

等于 3 的时候,返回的结果就是3*2*1

4.3 改成fun(4)看看:

首先 4 进来,n 等于 4,fun(n-1)就是fun(3)。调用fun(3)就相当于再次调用fun(n),就是4 *3* fun(2)

再次调用fun(2),再进来,前面return n * fun(n-1)这一截得到 2,fun(3-1)得到 2,所以最终得到4*3*2* fun(1)

fun(1)调用,结果出来就是个 1。就是4*3*2*1

def fun(n):if n == 1:return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)

5.这个递归函数的递归临界点在哪?

if n == 1:return 1

n=1的时候就不会调用自身了。当满足某个条件,不再调用自身,那么这个就被称为递归临界点。

例如改成n==-1

if n == -1:return 1

这个时候,这个函数的递归临界点在哪?

这个递归临界点就是-1

def fun(n):if n == -1:# 递归临界点:当达到递归临界点的时候,就不再调用自身函数的条件return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)

任何递归函数,它的原理都是一样的。定义一个递归函数,在递归函数里面它其实就是不断得调用自身,然后设置递归函数的时候,一定不能忘了递归条件。

6.斐波那契数列

后面的数都是等于前 2 个数相加的结果。

斐波那契数列的第一个数值是 1,第二个数值也是个 1,第三个数等于前两个数相加的结果(那就是 2),第四个数等于于前两个数相加的结果(那就是 3)。

[1,1,2,3,5]

以此类推。

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

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

相关文章

LeetCode 1484. 克隆含随机指针的二叉树(哈希/递归)

文章目录1. 题目2. 解题2.1 原地算法2.2 哈希表1. 题目 给你一个二叉树,树中每个节点都含有一个附加的随机指针,该指针可以指向树中的任何节点或者指向空(null)。 请返回该树的 深拷贝 。 该树的输入/输出形式与普通二叉树相同…

extjs2.0 ie8 下拉树_ExtJs下拉树的实现

直接上代码:Ext.ux.TreeCombo Ext.extend(Ext.form.ComboBox, {constructor : function(cfg) {cfg cfg || {};Ext.ux.TreeCombo.superclass.constructor.call(this, Ext.apply({maxHeight : 300,editable : false,mode : local,triggerAction : all,rootVisible :…

LeetCode 294. 翻转游戏 II(记忆化递归)

文章目录1. 题目2. 解题1. 题目 你和朋友玩一个叫做「翻转游戏」的游戏, 游戏规则:给定一个只有 和 - 的字符串。 你和朋友轮流将 连续 的两个 "" 反转成 "--"。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方…

mysql 逻辑备份导入数据库_mysql逻辑备份(mysql dump的使用)

mysqldump 属于MySQL客户端工具mysqldump备份工具对于MyISAM存储引擎实现备份是温备份,对innodb存储引擎是可以实现热备份。使用mysqldump备份数据库可以实现完全备份 二进制日志文件,这样也算是完全备份 增量备份。首先将这个数据库备份下来这就是完全…

LeetCode 271. 字符串的编码与解码(4位16进制字符+字符串)

文章目录1. 题目2. 解题1. 题目 请你设计一个算法,可以将一个 字符串列表 编码成为一个 字符串。 这个编码后的字符串是可以通过网络进行高效传送的,并且可以在接收端被解码回原来的字符串列表。 1 号机(发送方)有如下函数&…

通过SQL Server 2008 访问Oracle 10g

之前写过一篇关于SQL Server 访问MySQL 数据库的文章,最近正好又遇到需要访问Oracle 的情况,将配置过程记录下来也供大家参考。 准备工作 事先在需要访问Oracle 数据库的主机上完成以下工作: 1. 安装SQL Server 数据库:SQL Server…

mysql注入技巧原理_MySQL注入技巧总结

0x00 介绍以下所有技巧都只在mysql适用,因为它太灵活了。0x01 MYSQl灵活的语法1 MySQL语法以及认证绕过注释符:#,-- X(X为任意字符)/*(MySQL-5.1);%00or 11;%00or 11 union select 1,2or 11 #/*!50000or*/ 11 -- - //版本号为5.1.38时只要小于…

LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

文章目录1. 题目2. 解题2.1 二分查找2.2 DP1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n)示…

python 强制结束线程_在python中实现强制关闭线程的示例

Python 如何强制关闭线程过去只可以用来回忆,别沉迷在阴影中,否则永远看不清前面的路。Python用sleep停止一个线程的运行,而不影响主线程的运行,案例代码如下: from threading import *import time class MyThread(Thr…

LeetCode 1121. 将数组分成几个递增序列

文章目录1. 题目2. 解题1. 题目 给你一个 非递减 的正整数数组 nums 和整数 K,判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列。 示例 1: 输入:nums [1,2,2,3,3,4,4], K 3 输出:true 解释&#xff…

LeetCode 1272. 删除区间

文章目录1. 题目2. 解题1. 题目 给你一个 有序的 不相交区间列表 intervals 和一个要删除的区间 toBeRemoved&#xff0c; intervals 中的每一个区间 intervals[i] [a, b] 都表示满足 a < x < b 的所有实数 x 的集合。 我们将 intervals 中任意区间与 toBeRemoved 有交…

V折扣购买流程图

以前画的V折扣购买流程图&#xff1a; 转载于:https://www.cnblogs.com/wangkongming/archive/2013/01/16/2862275.html

LeetCode 549. 二叉树中最长的连续序列(树上DP)

文章目录1. 题目2. 解题1. 题目 给定一个二叉树&#xff0c;你需要找出二叉树中最长的连续序列路径的长度。 请注意&#xff0c;该路径可以是递增的或者是递减。 例如&#xff0c;[1,2,3,4] 和 [4,3,2,1] 都被认为是合法的&#xff0c;而路径 [1,2,4,3] 则不合法。 另一方面&…

LeetCode 1230. 抛掷硬币(DP)

文章目录1. 题目2. 解题1. 题目 有一些不规则的硬币。在这些硬币中&#xff0c;prob[i] 表示第 i 枚硬币正面朝上的概率。 请对每一枚硬币抛掷 一次&#xff0c;然后返回正面朝上的硬币数等于 target 的概率。 示例 1&#xff1a; 输入&#xff1a;prob [0.4], target 1 输…

LeetCode 634. 寻找数组的错位排列(DP)

文章目录1. 题目2. 解题1. 题目 在组合数学中&#xff0c;如果一个排列中所有元素都不在原先的位置上&#xff0c;那么这个排列就被称为错位排列。 给定一个从 1 到 n 升序排列的数组&#xff0c;你可以计算出总共有多少个不同的错位排列吗&#xff1f; 由于答案可能非常大&…

LeetCode 489. 扫地机器人(DFS)

文章目录1. 题目2. 解题1. 题目 房间&#xff08;用格栅表示&#xff09;中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API&#xff0c;可以向前进&#xff0c;向左转或者向右转。每次转弯90度。 当扫地机器人试图进入障碍物格子时&…

LeetCode 1215. 步进数(BFS/DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1&#xff0c;那么这个数就是一个「步进数」。 例如&#xff0c;321 是一个步进数&#xff0c;而 421 不是。 给你两个整数&#xff0c;low 和 high&#xff0c;请你…

python自动化入门_python自动化-python入门

1、安装python&#xff0c;配置环境变量。windows下是安装路径直接配到环境变量里面就可以mac添加环境变量在~/.bash_profile这个文件中&#xff0c;添加一行alias python"/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/bin/python3.7"问…

LeetCode 364. 加权嵌套序列和 II(重复叠加)

文章目录1. 题目2. 解题1. 题目 给一个嵌套整数序列&#xff0c;请你返回每个数字在序列中的加权和&#xff0c;它们的权重由它们的深度决定。 序列中的每一个元素要么是一个整数&#xff0c;要么是一个序列&#xff08;这个序列中的每个元素也同样是整数或序列&#xff09;。…

LeetCode 第 31 场双周赛(273/2767,前9.87%,第3次全部通过)

文章目录1. 比赛结果2. 题目1. LeetCode 5456. 在区间范围内统计奇数数目 easy2. LeetCode 5457. 和为奇数的子数组数目 medium3. LeetCode 5458. 字符串的好分割数目 medium4. LeetCode 5459. 形成目标数组的子数组最少增加次数 hard1. 比赛结果 双周赛题目比较简单。第一题没…