自己动手写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))第一個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))運行后報錯:
生成器的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))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))yield只能在函數里面用。yield關鍵字是用在創建生成器的時候,只要函數里面使用了yield關鍵字,在調用函數的時候,函數不會立馬被執行。
因為這個函數不是簡單的函數了,它是個生成器。
在函數外面,是沒辦法用yield關鍵字的。
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))2.4throw()方法:在生成器內部主動引發一個異常。參數:1.異常類型。2.異常信息。
這個方法可以接收 2 個參數,第一個參數:Exception 異常類型。第二個參數:傳入異常的信息。
Exception 報錯:
g.throw(Exception,"Method throw called!")
ValueError:
g.throw(ValueError,"清菡,大事不好,報錯了,嚶嚶嚶~")
二、遞歸函數
1.什么是遞歸函數
在函數中調用函數自身,我們把這樣的函數叫做遞歸函數。
2.遞歸函數調用原理圖
3.遞歸邊界
遞歸邊界:退出遞歸的終止條件。
def func():print('99999')func()func()在外面調用函數,直接陷入一個死循環。在函數內部調用func()這個函數,又到def func():這里來執行,然后print('99999'),又func()調用。
不斷得自身調用,這樣就造成了死循環。
Pycharm 有個檢測機制: 當它內部檢測到這個是個無限遞歸,沒有遞歸臨界點的一個遞歸函數,那么這個時候,它遞歸多少次之后,會自動給終止了。
使用遞歸函數的時候,一定要注意一個點:就是一定要設置遞歸的邊界。遞歸的邊界就是遞歸函數的終止條件。
如果你不設置遞歸邊界,那么你定義的遞歸函數就是個死循環,一直無限得調用自身。
4.通過遞歸函數實現的任意數的階乘
4.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)。
如果在這里用遞歸函數,調用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)。
這個時候會再次調用自身這個函數:
這個時候 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]
以此類推。
總結
以上是生活随笔為你收集整理的自己动手写cpu 光盘_自己动手写CPU配套源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libsvm回归参数寻优cgp_【lig
- 下一篇: JAVA校内报纸实验_实验(实训)中心2