剛開(kāi)始學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候看不明白這個(gè)偽代碼到底是個(gè)啥厕怜,經(jīng)過(guò)一番查閱資料,以下是一些總結(jié)與思考~~
能干自己的事兒未檩,也要能向別人表達(dá)自己到底在干啥事兒戴尸。
原則上,使用偽代碼冤狡,不用拘泥于具體實(shí)現(xiàn)孙蒙。
相比程序語(yǔ)言(例如 Java, C++,C, Dephi等等),它更類似自然語(yǔ)言悲雳,是半角化的挎峦、不標(biāo)準(zhǔn)的語(yǔ)言。使用其的目的在于將整個(gè)算法運(yùn)行過(guò)程的結(jié)構(gòu)用接近自然語(yǔ)言的形式(可以使用任何一種你熟悉的文字合瓢,關(guān)鍵是將程序的意思表達(dá)出來(lái))描述出來(lái)坦胶。
雖然偽代碼的寫法常常與個(gè)人的書寫習(xí)慣相關(guān),但業(yè)內(nèi)仍有一些約定俗成的詞匯和表達(dá)方式晴楔;這里就一些常見(jiàn)的顿苇、容易引起歧義的的表達(dá)方式進(jìn)行了總結(jié)和梳理,同時(shí)也是我個(gè)人偽代碼書寫習(xí)慣的整理税弃。此外纪岁,在日后的學(xué)習(xí)中與項(xiàng)目的溝通中常常也會(huì)涉及到成員之間的算法構(gòu)想的交流,手持一份如此的偽代碼規(guī)則書则果,也會(huì)使合作流暢許多幔翰。
(但其實(shí)過(guò)度成文的規(guī)則到最終都會(huì)變成編程語(yǔ)言吧~規(guī)則是死的,人是活的短条。代碼是死的导匣,偽代碼是活的(偷笑
1.書寫規(guī)則
可考慮采用類 Pascal 語(yǔ)言的語(yǔ)法規(guī)則(即類似 python 取對(duì)對(duì)齊)。
盡量采用全英文的方式書寫(其實(shí)統(tǒng)一起來(lái)就好茸时?但是感覺(jué)用英文書寫比較能和其他函數(shù)匹配起來(lái)~)
注:類 Pascal 語(yǔ)言的偽代碼的語(yǔ)法規(guī)則是:在偽代碼中贡定,每一條指令占一行(else if 除外)。指令后不跟任何符號(hào)(Pascal 和 C 中語(yǔ)句要以分號(hào)結(jié)尾)可都。書寫上的“縮進(jìn)”表示程序中的分支程序結(jié)構(gòu)缓待。這種縮進(jìn)風(fēng)格也適用于 if-then-else 語(yǔ)句。
2.運(yùn)算
← :賦值
e.g.
x ← x + 1
Meaning:x ++渠牲,x += 1旋炒,x = x + 1
* :對(duì)非向量的多項(xiàng)式——簡(jiǎn)單相乘;對(duì)矩陣签杈、向量:element wise product
e.g.
x ← a * b
Meaning:x = a * b
(np.array[1,3] )M ← (np.array[1,3])A * (np.array[1.3]) B
Meaning:M[i] = A[i] * B[i]
dot:點(diǎn)積(矩陣運(yùn)算)
e.g.
(np.array[1,3]) M ← (np.array[1,n]) A dot (np.array[n,3]) B
Meaning:M = np.dot(A,B)
/:除法瘫镇,取完整商的 float 類型
e.g.
a ← /b
Meaning:float a /= b
a ← b / c
Meaning:float a = b/c
div:除法鼎兽,取商的整數(shù)部分
e.g.
a ← div b
Meaning:float a /= b
a ← b div c
Meaning:float a = b/c
%:模,即取余數(shù)
3.注釋格式
單行注釋:#……
跨行注釋:##……##
*定義變量的語(yǔ)句不用寫出來(lái)铣除,但必須在注釋中給出谚咬。
4.分支、循環(huán)
4.1 if else
if …
(elif …)
else …
和 python 里面一樣尚粘,長(zhǎng)執(zhí)行語(yǔ)句可與 goto + label 搭配择卦,短執(zhí)行語(yǔ)句可與 switch 搭配或直接搭配短執(zhí)行語(yǔ)句,便于查詢條件郎嫁、組織邏輯結(jié)構(gòu)秉继;
4.2 do… while/until, while
不建議使用,容易影響正式代碼也寫成 do while/until泽铛,判斷先后標(biāo)準(zhǔn)容易造成歧義尚辑,在不同的情況下可能會(huì)有意料不到的非指針形參,使代碼陷入死循環(huán)盔腔,而且有的語(yǔ)言沒(méi)有 until這個(gè)指令腌巾。盡量用 for 循環(huán)+if…break/continue/pass 來(lái)代替;
4.3 for 循環(huán)
①對(duì)于 for i in range铲觉,一律采用 range[/( a , b ]/)澈蝙,即采用數(shù)學(xué)中的開(kāi)閉區(qū)間來(lái)表示 range范圍;對(duì) a 和 b 沒(méi)有嚴(yán)格的大小要求撵幽,如果 b<a灯荧,依然意味著(倒序)從 a 開(kāi)始到 b 之間取 i;
②對(duì)于 for I in range盐杂,如果對(duì)步長(zhǎng)等格式有指定逗载,可用注釋標(biāo)明 step = 步長(zhǎng)數(shù);如果step = -1链烈,則意味著取倒序厉斟;
4.4 max/min
取最大:max{a,b,c} or max{一個(gè)數(shù)列},取最小類似强衡;
4.5 其他關(guān)鍵詞
break, continue, pass 同 python擦秽。
即:盡量只采用 for 來(lái)描述循環(huán);if/else 結(jié)構(gòu)中盡量把條件放在更近的地方漩勤,分支語(yǔ)句采用 goto + label 或 switch 結(jié)構(gòu)進(jìn)行索引感挥。
其他:
1.通常每個(gè)算法開(kāi)始時(shí)都要描述它的輸入和輸出,而且盡量采用 part / label 等關(guān)鍵字給算法打標(biāo)簽越败,一邊在解釋算法的過(guò)程中快速索引触幼;
2.定義變量的語(yǔ)句不用寫出來(lái),但必須在注釋中給出究飞;
3.邏輯表達(dá)式可以使用關(guān)系運(yùn)算符 =(或者==置谦,建議用==) 堂鲤、≠、<媒峡、>筑累、≤ 和 ≥,以及邏輯運(yùn)算符與(and)丝蹭、或(or)、非(not)坪蚁;
4.涉及到調(diào)用未編寫的函數(shù)奔穿,可以直接 call 函數(shù)名,然后在注釋中解釋它的作用(參數(shù)敏晤、功能贱田、return)
總而言之,偽代碼的原則:簡(jiǎn)潔清晰嘴脾、易理解男摧、易索引。
參考資料:
https://baike.baidu.com/item/%E4%BC%AA%E4%BB%A3%E7%A0%81/10321865
(百度百科)
https://www.cnblogs.com/linuxAndMcu/p/11242905.html#_label1
https://www.php.cn/csharp-article-415083.html
(他人博客)
以及一些個(gè)人經(jīng)驗(yàn)的總結(jié)