精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手寫編程語言-遞歸函數是如何實現的?

開發 前端
本篇文章主要是記錄一下在 GScript 中實現遞歸調用時所遇到的坑,類似的問題在中文互聯網上我幾乎沒有找到相關的內容,所以還是很有必要記錄一下。

前言

本篇文章主要是記錄一下在 GScript 中實現遞歸調用時所遇到的坑,類似的問題在中文互聯網上我幾乎沒有找到相關的內容,所以還是很有必要記錄一下。

在開始之前還是簡單介紹下本次更新的 GScript v0.0.9 所包含的內容:

  • 支持可變參數
  • 優化append 函數語義
  • 優化編譯錯誤信息
  • 最后一個就是支持遞歸調用

先看第一個可變參數:

printf(string format, any ...a){}
string sprintf(string format, any ...a){}

以上是隨著本次更新新增的兩個標準函數,均支持可變參數,其中使用 ... 表示可變參數,調用時如下:

printf("hello %s ","123");
printf("hello-%s-%s ","123","abc");
printf("hello-%s-%d ","123",123);
string format = "this is %s ";
printf(format, "gscript");
string s = sprintf("nice to meet %s", "you");
assertEqual(s,"nice to meet you");

與大部分語言類似,可變參數本質上就是一個數組,所以可以拿來循環遍歷:

int add(string s, int ...num){
println(s);
int sum = 0;
for(int i=0;i<len(num);i++){
int v = num[i];
sum = sum+v;
}
return sum;
}
int x = add("abc", 1,2,3,4);
println(x);
assertEqual(x, 10);
append(any[] a, any v){}

之后是優化了內置函數 append() 的語義,本次優化來自于 issue12 的建議:https://github.com/crossoverJie/gscript/issues/12。

int[] a={1,2,3};
println(a);
println();
a = append(a,4);
println(a);
int[] a={1,2,3};
println(a);
println();
append(a,4);
int b = a[3];
assertEqual(4, b);
println(a);

現在 append 之后不需要再重新賦值,也會追加數據,優化后這里看起來是一個值/引用傳遞的問題,但其實底層也是值傳遞,只是在語法上增加了這樣的語法糖,幫使用者重新做了一次賦值。

之后是新增了編譯錯誤信息提示,比如下面這段代碼:

a+2;
b+c;

使用沒有聲明的變量,現在會直接編譯失敗:

1:0: undefined: a
2:0: undefined: b
2:2: undefined: c
class T{}
class T{}
2:0: class T redeclared in this block

重復聲明之類的語法錯誤也有相關提示。

最后一個才是本次討論的重點,也就是遞歸函數的支持。

int num(int x,int y){
if (y==1 || y ==x) {
return 1;
}
int v1 = num(x - 1, y - 1);
return c;
}

再上一個版本中 int v1 = num(x - 1, y - 1); 這行代碼是不會執行的,具體原因后文會分析。

現在利用遞歸便可以實現類似于打印楊輝三角之類的程序了:

int num(int x,int y){
if (y==1 || y ==x) {
return 1;
}
int v1 = num(x - 1, y - 1);
int v2 = num(x - 1, y);
int c = v1+v2;
return c;
}
printTriangle(int row){
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= row - i; j++) {
print(" ");
}
for (int j = 1; j <= i; j++) {
print(num(i, j) + " ");
}
println("");
}
}
printTriangle(7);
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1

函數中的 return

int num(int x,int y){
if (y==1 || y ==x) {
return 1;
}
int v1 = num(x - 1, y - 1);
return c;
}

現在我們來看看這樣的代碼為什么執行完 return 1 之后就不會執行后邊的語句了。

其實在此之前我首先解決的時候函數 return 后不能執行后續 statement 的需求,其實正好就是上文提到的邏輯,只是這里是遞歸而已。

先把代碼簡化一下方便分析:

int f1(int a){
if (a==10){
return 10;
}
println("abc");
}

當參數 a 等于 10 的時候確實不能執行后續的打印語句了,那么如何實現該需求呢?

以正常人類的思考方式:當我們執行完 return 語句的時候,就應該標記該語句所屬的函數直接返回,不能在執行后續的 statement。

可是這應該如何實操呢?

其實看看 AST 就能明白了:

圖片

當碰到 return 語句的時,會遞歸向上遍歷語法樹,標記上所有 block 節點表明這個 block 后續的語句不再執行了,同時還得把返回值記錄下來。

這樣當執行到下一個 statement 時,也就是 println("abc"); 則會判斷他所屬的 block 是否有被標記,如果有則直接返回,這樣便實現了 return 語句不執行后續代碼。

部分實現代碼如下:

func (v *Visitor) scanBlockStatementCtx(tree antlr.ParseTree, value interface{}) {
context, ok := tree.(*parser.BlockContext)
if ok {
if v.blockCtx2Mark == nil {
v.blockCtx2Mark = make(map[*parser.BlockContext]interface{})
}
v.blockCtx2Mark[context] = value
}
if tree.GetParent() != nil {
v.scanBlockStatementCtx(tree.GetParent().(antlr.ParseTree), value)
}
}

圖片

源碼地址:https://github.com/crossoverJie/gscript/blob/793d196244416574bd6be641534742e57c54db7a/visitor.go#L182。

遞歸的問題

但同時問題也來了,就是遞歸的時候也不會執行后續的遞歸代碼了。

其實解決問題的方法也很簡單,就是在判斷是否需要直接返回那里新增一個條件,這個 block 中不存在遞歸調用。

所以我們就得先知道這個 block 中是否存在遞歸調用。

整個過程有以下幾步:

  • 編譯期:在函數聲明處記錄下函數與當前context 的映射關系。
  • 編譯期:掃描statement 時,取出該 statement 的 context 所對應的函數。
  • 編譯期:掃描到的statement 如果是一個函數調用,則判斷該函數是否為該 block 中的函數,也就是第二步取出的函數。
  • 編譯期:如果兩個函數相等,則將當前block 標記為遞歸調用。
  • 運行期:在剛才判斷return 語句處,額外多出判斷當前 block 是否為遞歸調用,如果是則不能返回。

部分代碼如下:

圖片圖片

https://github.com/crossoverJie/gscript/blob/3e179f27cb30ca5c3af57b3fbf2e46075baa266b/resolver/ref_resolver.go#L70。

總結

這里的遞歸調用其實卡了我挺長時間的,思路是有的,但是寫出來的代碼總是和預期不符,當天晚上坐在電腦面前到凌晨兩三點,百思不得其解。

最后受不了上床休息的時候,突然一個靈光乍現讓我想到了解決方案,于是第二天起了個早床趕忙實踐,還真給解決了。

所以有些時候碰到棘手問題時給自己放松一下,往往會有出其不意的效果。

最后是目前的遞歸在某些情況下性能還有些問題,后續會盡量將這些標記過程都放在編譯期,編譯慢點沒事,但運行時慢那就有問題了。

之后還會繼續優化運行時的異常,目前是直接 ??panic??,堆棧也沒有,體感非常不好;歡迎感興趣的朋友試用反饋bug。

責任編輯:姜華 來源: crossoverJie
相關推薦

2022-09-19 08:10:37

運算符函數語言

2022-10-17 09:08:01

2021-07-20 15:42:05

編程語言PythonJava

2024-07-10 08:22:42

2021-05-28 05:34:06

Golang語言編程

2021-08-30 15:47:34

編程技能開發

2011-06-20 08:48:17

編程語言

2020-11-12 07:00:50

JavaScript前端編程語言

2021-08-23 15:05:21

PyretJavaScript編程

2017-11-28 16:57:18

2017-09-12 11:02:51

Python編程語言

2019-07-17 13:45:42

網絡安全防火墻軟件

2015-10-29 09:36:31

高端編程語言

2018-11-21 09:33:01

2013-02-18 09:20:10

2015-10-19 09:23:44

新編編程女人

2017-12-27 14:52:21

JSGo編程語言

2020-12-09 09:33:16

編程語言C語言匯編語言

2018-11-11 15:29:13

大數據語言Java

2009-11-18 16:39:51

PHP遞歸刪除目錄
點贊
收藏

51CTO技術棧公眾號

91精品国产高清一区二区三蜜臀| www.日日操| 刘亦菲毛片一区二区三区| 性欧美长视频| 夜夜嗨av一区二区三区免费区| 国产又黄又猛又粗| 日韩精品卡一| 久久久亚洲高清| 91日韩在线播放| 五月天综合激情网| 国产大片一区| 欧美精品一区二区三区蜜桃| 热久久精品免费视频| 欧美1—12sexvideos| 久久久国产一区二区三区四区小说| 91精品在线国产| 国产精品人人人人| 自拍偷拍欧美| 在线日韩精品视频| 最近日本中文字幕| 国产午夜精品一区在线观看| 91成人国产精品| 夜夜添无码一区二区三区| av大片在线播放| 不卡av电影在线播放| 成人免费视频在线观看超级碰| 国产第一页在线视频| 欧美日韩破处视频| 午夜天堂影视香蕉久久| 天天做天天爱天天高潮| 牛牛澡牛牛爽一区二区| 粉嫩久久99精品久久久久久夜| 国产精品久久久久久久9999| 日韩在线观看第一页| 中文字幕亚洲综合久久五月天色无吗''| 亚洲毛片一区二区| 中文视频在线观看| 日韩精品一区二区三区中文| 欧美日韩国产电影| 一级黄色香蕉视频| 久久爱91午夜羞羞| 欧美日韩午夜视频在线观看| 日韩精品在线观看av| a毛片在线播放| 国产精品视频你懂的| 欧美精品尤物在线| 深夜福利在线观看直播| 成人精品免费看| 粉嫩av免费一区二区三区| av在线亚洲天堂| 国产一区二区在线看| 成人免费观看网址| 91theporn国产在线观看| 日韩av高清在线观看| 国产成人黄色av| 无码无套少妇毛多18pxxxx| 小嫩嫩精品导航| 欧美在线性视频| 亚洲欧美综合另类| 男女精品视频| 国产成人久久久| 欧美brazzers| 青青草国产精品97视觉盛宴| 国产精品视频xxxx| 一级黄色片在线观看| 国内久久婷婷综合| 亚洲一区中文字幕| 亚洲黄色在线免费观看| 波多野洁衣一区| 精品视频一区在线| 国产夫妻性爱视频| 久久久久观看| 亚洲美女久久久| 免费看黄色的视频| 色乱码一区二区三区网站| 欧美一区二区三区思思人| 午夜激情影院在线观看| 日韩成人在线看| 亚洲第一色中文字幕| 91中文字幕永久在线| 成人在线电影在线观看视频| 久久色免费在线视频| 久久精品一区二区三| 国产精品毛片一区二区三区| 国产成人精品最新| 国产成人精品白浆久久69| 99re8在线精品视频免费播放| 日本一区二区在线视频观看| 久cao在线| 天涯成人国产亚洲精品一区av| 国产无套内射久久久国产| 国产成人免费精品| 亚洲成人激情视频| 五月激情四射婷婷| 欧美深夜福利| 国产精品白嫩美女在线观看| av在线免费在线观看| 久久久亚洲高清| 999久久欧美人妻一区二区| 天堂√中文最新版在线| 5566中文字幕一区二区电影| 中文视频在线观看| 99精品在线观看| 欧美亚洲激情视频| 一级做a爱片性色毛片| 91免费版在线看| 日本一级淫片演员| 日本.亚洲电影| 欧美精品一区二区三区久久久| 91视频免费在观看| a91a精品视频在线观看| 国产日本欧美在线观看| 日本精品专区| 亚洲一区二区三区视频在线| 五月婷婷六月丁香激情| 色橹橹欧美在线观看视频高清| www国产亚洲精品久久网站| 国产精品老女人| 国产裸体歌舞团一区二区| 日本午夜一区二区三区| 超碰在线视屏| 精品美女在线播放| 国产极品国产极品| 久久黄色级2电影| 欧美中文娱乐网| 国产精品原创| 日韩精品一区二区三区视频在线观看| 亚洲无人区码一码二码三码的含义| 在线国产精品一区| 91九色偷拍| 老司机在线看片网av| 欧洲精品在线观看| 国产精品三级在线观看无码| 亚洲大胆在线| 国产高清一区视频| 四虎影视国产在线视频| 9191成人精品久久| 91 在线视频| 久久精品国产网站| 亚洲 日韩 国产第一区| 成人看片在线观看| 国产午夜精品全部视频在线播放| 日本视频在线观看免费| 99re热视频精品| 欧美一级在线看| 日韩av午夜| 欧美在线视频网| 四虎成人免费在线| 欧美色xxxx| 日本高清www| 日日夜夜一区二区| 日本高清一区| 成人免费在线观看视频| 色婷婷久久av| 国产永久免费视频| 亚洲视频免费在线| 手机在线观看日韩av| 一区二区三区国产精华| 97伦理在线四区| 国产经典三级在线| 亚洲国产欧美一区| 中文字幕第四页| 久久嫩草精品久久久精品| 免费激情视频在线观看| 日韩电影二区| 亚洲bt欧美bt日本bt| 污污片在线免费视频| 精品国产免费一区二区三区四区| 国产精彩视频在线观看| 91日韩一区二区三区| 99视频在线免费| 91亚洲自偷观看高清| 51国偷自产一区二区三区| av在线加勒比| 亚洲欧美日韩高清| 91超薄丝袜肉丝一区二区| 亚洲女爱视频在线| 亚洲自拍偷拍精品| 日韩精品一级中文字幕精品视频免费观看| 日韩免费三级| 国产精选久久| 97视频免费在线观看| 国产黄在线观看免费观看不卡| 欧美精品第1页| 国产在线视频卡一卡二| 国产亚洲精品久| 日本高清免费在线视频| 亚洲区第一页| 亚洲人一区二区| 91成人午夜| 国产精品xxx视频| 中文字幕免费高清电视剧网站在线观看| 日韩av网站导航| 91国偷自产中文字幕久久| 亚洲午夜精品久久久久久久久| 中文字幕人妻一区二区| 久久超级碰视频| 激情伊人五月天| 国产精品成人一区二区不卡| 激情小说网站亚洲综合网| 成人国产精选| 2020欧美日韩在线视频| 免费人成在线观看播放视频| 日韩成人在线免费观看| 国产视频一区二区三区四区五区| 精品久久久久久久久久久久| 日韩欧美国产成人精品免费| 91麻豆精品在线观看| 午夜免费福利网站| 免费观看30秒视频久久| 成年人视频观看| 欧美精品首页| 亚洲精品视频一区二区三区| 欧美一级色片| 国产精品乱码| 国产精品一区二区三区四区在线观看 | 日韩伦人妻无码| 中文字幕一区二区三| 国产偷人妻精品一区| 国产激情一区二区三区| 黑森林精品导航| 亚洲尤物精选| 欧美性生活影院| 欧美国产日韩在线播放| 欧美成人午夜| 婷婷精品国产一区二区三区日韩| av网站在线免费| 一区二区三区久久久| 国产人妻大战黑人20p| 成人永久免费视频| 亚洲一级免费在线观看| 激情婷婷欧美| 综合久久国产| 欧美偷拍综合| 欧美重口乱码一区二区| 欧美黑人巨大videos精品| 91国产在线播放| 二区三区精品| 国产日韩欧美一二三区| 日韩毛片在线| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲欧美另类动漫| 免费视频一区二区三区在线观看| 日韩在线观看a| 国产综合婷婷| 欧美一级中文字幕| 欧美一区成人| 免费的av在线| 国产精品观看| 日本五级黄色片| 一区三区视频| 国自产拍偷拍精品啪啪一区二区| 亚洲三级网站| 久色视频在线播放| 欧美专区在线| 欧美日韩亚洲一二三| 日韩avvvv在线播放| 五月天婷婷激情视频| 美女视频黄频大全不卡视频在线播放| 一区二区三区视频网| 蜜臀久久99精品久久久画质超高清 | 国产精品无码无卡无需播放器| 欧美国产精品中文字幕| 国精产品视频一二二区| 亚洲色大成网站www久久九九| 国产精品免费在线播放| 97精品在线播放| 天堂久久av| 国产不卡一区二区三区在线观看| av毛片精品| 久久精品综合一区| 狠狠做六月爱婷婷综合aⅴ| 亚洲电影一二三区| 亚洲精品99| 成年人午夜免费视频| 久久久精品性| 天堂在线中文在线| jlzzjlzz亚洲日本少妇| 成人片黄网站色大片免费毛片| 中文字幕电影一区| 欧美成人手机视频| 欧美午夜www高清视频| 一级特黄色大片| 亚洲国产中文字幕久久网 | 亚洲国产欧美日韩精品| 黄色片在线播放| 欧美成人免费全部观看天天性色| 高潮在线视频| 国产在线精品播放| 久久香蕉精品香蕉| 亚洲午夜在线观看| 亚洲人成免费| 亚洲国产日韩欧美在线观看| 高清视频一区二区| xxxx日本黄色| 亚洲国产精品一区二区久久恐怖片 | 亚洲性人人天天夜夜摸| 少妇人妻互换不带套| 国产不卡一区视频| 极品尤物一区二区| 五月综合激情婷婷六月色窝| 91美女精品网站| 亚洲精选中文字幕| 三级资源在线| 国产精品专区一| 亚洲免费专区| 成人在线免费观看视频网站| 奇米在线7777在线精品| 无码一区二区精品| 亚洲色图视频网| 欧美在线视频精品| 亚洲激情视频在线| v片在线观看| 国产精品偷伦视频免费观看国产| 国产精品自在| 久久久久久av无码免费网站下载| 日本在线不卡视频一二三区| 欧美成人三级伦在线观看| 亚洲精品第一国产综合野| 在线观看毛片视频| 国产精品白丝在线| yjizz国产| 精品处破学生在线二十三| 日本在线免费看| 国产精品国产福利国产秒拍 | 国产自产视频一区二区三区| 国产伦理片在线观看| 午夜国产不卡在线观看视频| 午夜精品久久久久久久99| 久久久www成人免费精品| 粉嫩91精品久久久久久久99蜜桃 | 免费av在线电影| 久久久这里只有精品视频| 国产一区二区三区免费观看在线 | 日本在线观看网站| 国产美女久久久| 成人av动漫在线观看| 亚洲一区二区蜜桃| 国产欧美视频一区二区| 特级西西444www大胆免费看| 亚洲天堂av网| 欧洲精品一区二区三区| 久久久久综合一区二区三区| 午夜在线精品偷拍| 90岁老太婆乱淫| 色综合网站在线| 久久精品a一级国产免视看成人| 欧美一级电影久久| 视频一区中文| 性生交免费视频| 中文字幕国产一区| 一级黄色大片免费| 久久韩剧网电视剧| 在线成人免费| 992tv快乐视频| 国产mv日韩mv欧美| 亚洲国产精品成人无久久精品| 亚洲成人精品av| 亚洲一级少妇| 日韩国产在线一区| 开心九九激情九九欧美日韩精美视频电影 | 欧美激情一区二区三区在线视频观看| 日韩综合一区二区三区| www精品久久| 久久久久国产精品麻豆| 中文天堂在线视频| 久久久精品日本| a看欧美黄色女同性恋| 国产黄页在线观看| 国产人成亚洲第一网站在线播放| 在线免费一级片| 欧美黑人巨大xxx极品| 秋霞蜜臀av久久电影网免费 | 国产精品一区二区在线观看网站 | 在线观看欧美日本| www视频在线免费观看| 国产精品香蕉视屏| 久久亚洲二区| 国产探花在线免费观看| 精品播放一区二区| 韩国三级一区| 特级西西人体www高清大胆| zzijzzij亚洲日本少妇熟睡| 午夜一区二区三区四区| 欧美wwwxxxx| 久久av中文| 国产又粗又猛大又黄又爽| 精品国产91久久久久久| 97最新国自产拍视频在线完整在线看| 91入口在线观看| 亚洲人成伊人成综合图片| 欧美日韩国产免费| 黄色一级片免费在线观看| 一本色道久久88综合日韩精品| 欧洲亚洲精品久久久久| 国产不卡一区二区视频| 国产精品传媒在线| 熟妇人妻系列aⅴ无码专区友真希| 国产精品丝袜一区二区三区| 国产精品地址|