自己动手写cpu 光盘_自己动手写CPU配套源码
自己動(dòng)手寫(xiě)CPU的源代碼,一共15章,可以完整實(shí)現(xiàn)MIPS的指令
文件:n459.com/file/25127180-476886294
以下內(nèi)容無(wú)關(guān):
-------------------------------------------分割線---------------------------------------------
目錄
- 一、往期回顧
- 1.生成器代碼詳解
- 2.生成器的三個(gè)方法
- 二、遞歸函數(shù)
- 1.什么是遞歸函數(shù)
- 2.遞歸函數(shù)調(diào)用原理圖
- 3.遞歸邊界
- 4.通過(guò)遞歸函數(shù)實(shí)現(xiàn)的任意數(shù)的階乘
- 5.這個(gè)遞歸函數(shù)的遞歸臨界點(diǎn)在哪?
- 6.斐波那契數(shù)列
- 三、系列推薦
一、往期回顧
1.生成器代碼詳解
def gen():for i in range(5):j = yield iprint(j)# send:與生成器進(jìn)行交互 g = gen()print(next(g)) print(next(g))第一個(gè)print(next(g))打印的 0,就是生成器生成的元素。第二個(gè)print(next(g))打印的 1 也是生成器生成的元素,None 是print(j)打印的j。
通過(guò)生成器獲取元素的時(shí)候,首先生成器進(jìn)去的話,當(dāng)調(diào)用生成器獲取里面的值,它會(huì)從上往下走,走到j(luò) = yield i這里,把yield這里的i這個(gè)值返回出來(lái),調(diào)用完gen()返回一個(gè)生成器g。
通過(guò)這個(gè)生成器next(g)去拿值的時(shí)候,然后它從上往下執(zhí)行代碼,走到j(luò) = yield i這里,yield相當(dāng)于把i,通過(guò)yield返回出去。
從生成器里面返回出來(lái),就生成一個(gè)數(shù)據(jù)。生成這個(gè)i,到第一個(gè)print(next(g))這里,打印的就是i。
第二個(gè)print(next(g)),再用next()調(diào)用生成器的時(shí)候,那么這個(gè)生成器會(huì)從yield之后繼續(xù)往下執(zhí)行。
通過(guò)next()去觸發(fā)生成器的時(shí)候,yield之后是沒(méi)有內(nèi)容的,j接收的就是空的,所以打印j的時(shí)候,打印出來(lái)的是個(gè)None。
2.生成器的三個(gè)方法
# 生成器的三個(gè)方法: send close throwdef gen():for i in range(5):j = yield iprint(j)# send:與生成器進(jìn)行交互 g = gen()print(g.send(100)) print(next(g)) print(next(g))運(yùn)行后報(bào)錯(cuò):
生成器的send()方法,它運(yùn)行的時(shí)候會(huì)從上一個(gè)yield結(jié)束的地方來(lái)進(jìn)行運(yùn)行。
在這里只創(chuàng)建了gen()這個(gè)生成器,這個(gè)生成器還沒(méi)有生成過(guò)任何數(shù)據(jù),這個(gè)時(shí)候生成器就暫停在函數(shù)最開(kāi)始的地方def gen():這里。
這里send(100)這個(gè)值進(jìn)去的話,在這里運(yùn)行,直接運(yùn)行for i in range(5):這個(gè)語(yǔ)句,send(100)生成進(jìn)去的這個(gè)值沒(méi)有地方接收,所以報(bào)錯(cuò)了。
send()必須在調(diào)用了一次next()之后才調(diào)用。可以和next()一樣,去獲取生成器里面的內(nèi)容。
2.1next()獲取生成器里面的內(nèi)容:
# 生成器的三個(gè)方法: send close throwdef gen():for i in range(5):j = yield iprint(j)# send:與生成器進(jìn)行交互 g = gen()print(next(g)) print(next(g)) # print(g.send(100))2.2send()在調(diào)用了一次next()之后調(diào)用,獲取生成器里面的內(nèi)容:
# 生成器的三個(gè)方法: send close throwdef gen():for i in range(5):j = yield iprint(j)# send:與生成器進(jìn)行交互 g = gen()print(next(g)) print(g.send(100)) # print(next(g))yield只能在函數(shù)里面用。yield關(guān)鍵字是用在創(chuàng)建生成器的時(shí)候,只要函數(shù)里面使用了yield關(guān)鍵字,在調(diào)用函數(shù)的時(shí)候,函數(shù)不會(huì)立馬被執(zhí)行。
因?yàn)檫@個(gè)函數(shù)不是簡(jiǎn)單的函數(shù)了,它是個(gè)生成器。
在函數(shù)外面,是沒(méi)辦法用yield關(guān)鍵字的。
2.3close():關(guān)閉生成器
def gen():for i in range(5):j = yield iprint(j)yield 100# send:與生成器進(jìn)行交互 g = gen()print(next(g)) # print(next(g)) # print(g.send(100))# close:關(guān)閉生成器 g.close() print(next(g))2.4throw()方法:在生成器內(nèi)部主動(dòng)引發(fā)一個(gè)異常。參數(shù):1.異常類(lèi)型。2.異常信息。
這個(gè)方法可以接收 2 個(gè)參數(shù),第一個(gè)參數(shù):Exception 異常類(lèi)型。第二個(gè)參數(shù):傳入異常的信息。
Exception 報(bào)錯(cuò):
g.throw(Exception,"Method throw called!")
ValueError:
g.throw(ValueError,"清菡,大事不好,報(bào)錯(cuò)了,嚶嚶嚶~")
二、遞歸函數(shù)
1.什么是遞歸函數(shù)
在函數(shù)中調(diào)用函數(shù)自身,我們把這樣的函數(shù)叫做遞歸函數(shù)。
2.遞歸函數(shù)調(diào)用原理圖
3.遞歸邊界
遞歸邊界:退出遞歸的終止條件。
def func():print('99999')func()func()在外面調(diào)用函數(shù),直接陷入一個(gè)死循環(huán)。在函數(shù)內(nèi)部調(diào)用func()這個(gè)函數(shù),又到def func():這里來(lái)執(zhí)行,然后print('99999'),又func()調(diào)用。
不斷得自身調(diào)用,這樣就造成了死循環(huán)。
Pycharm 有個(gè)檢測(cè)機(jī)制: 當(dāng)它內(nèi)部檢測(cè)到這個(gè)是個(gè)無(wú)限遞歸,沒(méi)有遞歸臨界點(diǎn)的一個(gè)遞歸函數(shù),那么這個(gè)時(shí)候,它遞歸多少次之后,會(huì)自動(dòng)給終止了。
使用遞歸函數(shù)的時(shí)候,一定要注意一個(gè)點(diǎn):就是一定要設(shè)置遞歸的邊界。遞歸的邊界就是遞歸函數(shù)的終止條件。
如果你不設(shè)置遞歸邊界,那么你定義的遞歸函數(shù)就是個(gè)死循環(huán),一直無(wú)限得調(diào)用自身。
4.通過(guò)遞歸函數(shù)實(shí)現(xiàn)的任意數(shù)的階乘
4.1 什么是階乘?
遞歸能實(shí)現(xiàn)的,通過(guò)循環(huán)都能實(shí)現(xiàn)。
Python 中遞歸用得不多,不太建議使用遞歸,因?yàn)檫f歸不太好用,用遞歸還不如用循環(huán)。
4.2 怎么去算階乘呢?
定義個(gè)函數(shù),算任意數(shù)的階乘。傳 1,就算 1 的階乘,傳 10 就算 10 的階乘。
可以這樣做:
首先要判斷下它傳進(jìn)來(lái)的這個(gè)參數(shù)是不是等于 1,如果是等于 1 的話,就直接給它return返回出去。然后,如果它不等于 1 的話,就返回return n * (n-1)*(n-2)。
n 傳進(jìn)來(lái)是 1,那應(yīng)該返回 1;如果傳的是 2,應(yīng)該返回return n * (n-1)。
如果在這里用遞歸函數(shù),調(diào)用func(1)。那么這個(gè)時(shí)候,這個(gè)func(1)調(diào)用遞歸函數(shù)。
這個(gè)函數(shù)返回的是什么?
調(diào)用這段代碼:
if n == 1:return 1返回的是個(gè) 1。
將代碼修改成如下:
def fun(n):if n == 1:return 1else:return n * fun(n-1)fun(3)如果是fun(3),3 傳進(jìn)來(lái):
def fun(n):if n == 1:return 1肯定是不成立的。
else后面的代碼return n * fun(n-1)。
這里的 n 是個(gè) 3,fun(n-1)就是fun(2),那么就是3 * fun(2)。
這個(gè)時(shí)候會(huì)再次調(diào)用自身這個(gè)函數(shù):
這個(gè)時(shí)候 n 是什么?
fun(2)的時(shí)候 n 是個(gè) 2,就是3 *2* fun(1)。 fun(1)再執(zhí)行下,出來(lái)的結(jié)果是個(gè) 1。那這里就是個(gè) 1,就是3*2*1。
等于 3 的時(shí)候,返回的結(jié)果就是3*2*1。
4.3 改成fun(4)看看:
首先 4 進(jìn)來(lái),n 等于 4,fun(n-1)就是fun(3)。調(diào)用fun(3)就相當(dāng)于再次調(diào)用fun(n),就是4 *3* fun(2)。
再次調(diào)用fun(2),再進(jìn)來(lái),前面return n * fun(n-1)這一截得到 2,fun(3-1)得到 2,所以最終得到4*3*2* fun(1)。
fun(1)調(diào)用,結(jié)果出來(lái)就是個(gè) 1。就是4*3*2*1。
def fun(n):if n == 1:return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)5.這個(gè)遞歸函數(shù)的遞歸臨界點(diǎn)在哪?
if n == 1:return 1當(dāng)n=1的時(shí)候就不會(huì)調(diào)用自身了。當(dāng)滿足某個(gè)條件,不再調(diào)用自身,那么這個(gè)就被稱(chēng)為遞歸臨界點(diǎn)。
例如改成n==-1
if n == -1:return 1這個(gè)時(shí)候,這個(gè)函數(shù)的遞歸臨界點(diǎn)在哪?
這個(gè)遞歸臨界點(diǎn)就是-1。
def fun(n):if n == -1:# 遞歸臨界點(diǎn):當(dāng)達(dá)到遞歸臨界點(diǎn)的時(shí)候,就不再調(diào)用自身函數(shù)的條件return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)任何遞歸函數(shù),它的原理都是一樣的。定義一個(gè)遞歸函數(shù),在遞歸函數(shù)里面它其實(shí)就是不斷得調(diào)用自身,然后設(shè)置遞歸函數(shù)的時(shí)候,一定不能忘了遞歸條件。
6.斐波那契數(shù)列
后面的數(shù)都是等于前 2 個(gè)數(shù)相加的結(jié)果。
斐波那契數(shù)列的第一個(gè)數(shù)值是 1,第二個(gè)數(shù)值也是個(gè) 1,第三個(gè)數(shù)等于前兩個(gè)數(shù)相加的結(jié)果(那就是 2),第四個(gè)數(shù)等于于前兩個(gè)數(shù)相加的結(jié)果(那就是 3)。
[1,1,2,3,5]
以此類(lèi)推。
總結(jié)
以上是生活随笔為你收集整理的自己动手写cpu 光盘_自己动手写CPU配套源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: libsvm回归参数寻优cgp_【lig
- 下一篇: JAVA校内报纸实验_实验(实训)中心2