一、遞迴
遞迴在電腦科學中,是指在函式的定義中使用函式自身的方法,遞迴是進行迴圈的一種技巧(在類lisp等函式語言中它也是實現迴圈的主要甚至唯一途徑,比如下面的lisp**)。
1、費波那西數列(義大利語:successione di fibonacci),又譯費波拿契數、斐波那契數列、費氏數列、**分割數列。
在數學上,費波那西數列是以遞迴的方法來定義:
遞迴是完成費波那西數列計算的方法之一,費波那西數列由0和1開始,之後的費波那西係數就由之前的兩數相加。
、rain****直譯器c語言實現
brain****,是一種極小化的計算機語言,它是由urban müller在2023年建立的。一種簡單的、可以用最小的編譯器來實現的、符合圖靈完全思想的程式語言。這種語言由八種運算子構成,brain****的計算方式如此與眾不同,基於乙個簡單的機器模型,除了指令,這個機器還包括:乙個以位元組為單位、被初始化為零的陣列、乙個指向該陣列的指標(初始時指向陣列的第乙個位元組)、以及用於輸入輸出的兩個位元組流。
下面是這八種狀態的描述,其中每個狀態由乙個字元標識:
字元含義
指標加一
指標減一
指標指向的位元組的值加一
指標指向的位元組的值減一
輸出指標指向的單元內容(ascii碼)
輸入內容到指標指向的單元(ascii碼)
如果指標指向的單元值為零,向後跳轉到對應的]指令的次一指令處
如果指標指向的單元值不為零,向前跳轉到對應的[指令的次一指令處
首先,完成這個直譯器,該程式對所需要用到的變數作了如下宣告:
1、陣列變數
char a[5000], f[5000]
其中a#include
int p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
char *d; int tmp;
r++;
while( *c ) else 執行程式,main以40為引數n的值,呼叫fib,fib陸續輸出前41個費波那西係數的值,也是說數列中的41個數(因為第1個數0不是第一項,而是第零項):
dp@dp:~ % gcc fib.c -o fib
dp@dp:~ % ./fib
第0項:0
第1項:1
第2項:1
第3項:2
第4項:3
第5項:5
第6項:8
第7項:13
第8項:21
第9項:34
第10項:55
第11項:89
第12項:144
第13項:233
第14項:377
第15項:610
第16項:987
第17項:1597
第18項:2584
第19項:4181
第20項:6765
第21項:10946
第22項:17711
第23項:28657
第24項:46368
第25項:75025
第26項:121393
第27項:196418
第28項:317811
第29項:514229
第30項:832040
第31項:1346269
第32項:2178309
第33項:3524578
第34項:5702887
第35項:9227465
第36項:14930352
第37項:24157817
第38項:39088169
第39項:63245986
第40項:102334155
其演算法可描述如下:
(1)fib函式在數列不為0時,進入遞迴狀態,反覆呼叫自己(也就是fib)。
這個過程雖然呼叫的都是fib函式,但每次呼叫的引數都不一定一致辭,因為每次呼叫函式,都將新的引數傳送給fib函式,每次fib函式的執行需要的引數都是上次fib函式在執行過程中傳遞的。此外,函式的引數傳遞方式是通過函式所屬的堆疊完成的,這意味著雖然遞迴多次反覆呼叫fib函式,但引數只是在本次fib函式執行中用到,使用完畢後堆疊空間就將本次所用的引數釋放。fib對fib自身進行不斷呼叫(**中的「fib_n(next, curr+next, n-1)」),每次呼叫fib_n函式,curr引數在增長中(curr引數表示數列中的當前項,初始值為0,每次新值為next),而next引數也在增長(next引數表示數列中的下一項,初始值為1,每次新值為curr+next),n引數在減少中(n是乙個計數器,注意這個計數器到0才算結束,每次減少1,n初始值為40,n控制了生成的費波那西數列的數的數量)。
(2)在n值等於0時,所有對fib函式的呼叫結束了,生成的費波那西數的數量達到了程式要求。在數列的開始處(**中的「n==0」),最後一次呼叫fib函式完成,函式返回了程式要求的數列中最後乙個數的計算(**中的「return curr;」),這時的curr等於102334155)。
C指標原理 5
plain view plain copy print?section data myvalue byte 67,68,69,70,0 mygs asciz c n section text globl main main 基位址 偏移位址 必須為暫存器 資料元素變址,資料元素長度 必須為暫存器 基...
C指標原理 6
內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 c 變數顯示出來。因為它具有這種能力,所以 asm 可以用作彙編指令和包含它的 c 程式之間的介面。簡單得說,內聯彙編,就是可以讓程式設計師在c語言中直接嵌入彙編 並與彙編 互動c程式中的c表示式,享受彙編的高執行效率。內聯彙編的格式是直接...
C指標原理 12
2 擴充計算器 加入對括號和注釋的支援,首先修改flex 檔案,在第二部分加入更多的詞法規則 對於注釋直接忽略 忽略注釋 然後,修改bison term number abs term leftbracket exp rightbracket 我們的注釋以 表示 測試結果 myhaspl myhas...