J语言初步,绝妙的符号系统,神的计算器
文章目錄
- 簡介
- 算術符號和優先級
- 賦值和比較
- 復合動詞
- 動詞列表
- 理解階乘!!
簡介
J語言更像是一個大型符號系統,用以解決復雜的數學運算。所以在下載J語言之后,進入jconsole,就可以憑借感覺進行數學運算了。
其中加減乘除分別是+, -, *, %。但是玩過這么多編程語言,對這些常規的運算其實已經有些倦怠了,所以直接來個鬼酷一點的,事先說明,J語言中NB.后為注釋。
1 2 3 4 5 * 2 NB. 數乘列表 2 4 6 8 108 <: 7 8 9 NB. 數值和列表比較 0 1 17 8 9 < 9 8 7 NB. 列表和列表比較 1 0 0(+/ % #) 2.5 3.1 11 2 NB. 求均值 4.65fact=: 1: ` (* $:@<:) @. * NB. 此為階乘fact 5 NB. 計算5的階乘 120前三條很容易理解,就不解釋了;第五條稍微有點難,也先不解釋。這里先看看求均值的代碼(+/ % #),其中%是個二元運算符——除法,這個除法作用在兩個符號之間,其中+/用于數列求和,#則返回數列長度,二者相除就得到均值。
這個就是J語言符號運算的魅力,而且J語言提供了Android等版本,可以在手機上使用,下載地址:Android版本;IOS版本,在手機上的效果為
接下來,為了理解階乘代碼,先做一點最基礎的J語言符號訓練,主要包括三個內容,一是基礎的運算符號;二是與if相關的語句;三是復合語句的概念。
算術符號和優先級
初學J語言,可以把運算符分為兩類,即一元運算符和二元運算符,有的時候,同一個符號在進行一元或者二元運算的時候,會有不同的含義,例如%作為二元運算,表示除法,作為一元運算,表示求倒數
% 5 0.23 % 5 0.6下表中列出了常見的算術符號
| 一元 | 負號 | 正號 | 取符號 | 倒數 | e指數 | 根號 |
| 二元 | 加 | 減 | 乘 | 除 | 乘方 | 猜猜是什么 |
其中-作為一元運算表示取負,而J語言中的復數用下劃線表示,即_1表示 ? 1 -1 ?1。
和其他語言不同,J語言中乘法并不比加法優先,如果想更改二元運算的順序,可以使用括號。而一般來說,一元運算比二元運算有著更高的優先級。
2 * 3 + 4 NB. J語言中乘法并不比加法更優先 14(2 * 3) + 4 NB. 但括號還是優先的 102 * * -3 NB. * -3取-3的符號,為-1 _2 NB. 然后2乘以負一得到-2賦值和比較
在J語言中,通過=:進行變量賦值,而且作為函數式語言,=:不僅可以賦值變量,也可以賦值函數
a =: 5 NB. 把5賦值給aa 5b =: - NB. 把運算-賦值給bb a NB. 相當于 - a _5a b a NB. 相當于 a - a 0type 'b' ┌────┐ │verb│ └────┘type 'a' ┌────┐ │noun│ └────┘type可以返回符號的類別,在其他語言中,我們一般把-稱作運算符,但在J語言中,則稱作動詞;而變量則為名詞。在J語言中,還有副詞、連詞等。
=:用于賦值,而其他語言中常用的=在J語言中則表示相等
| = | 判斷相等 | =: | 賦值 |
| < | 小于 | <: | 小于等于 |
| > | 大于 | >: | 大于等于 |
復合動詞
通過=:可以進行賦值,而且可以賦值為名詞,還可以賦值為動詞,例如<:和>:分別表示減1和加1,但容易記混,所以下面新建兩個函數表示
addOne =: >:minusOne =: <:addOne 10 11minusOne 10 9這個本來沒什么,不過在多個動詞連接時卻出現了問題,比如想實現類似 1 x + 1 \frac{1}{x}+1 x1?+1的功能,如果x=5,那么就是下面這種
>: % 5 1.2那么如果想做一個復合函數,也理應是test =: >: %,但下面顯然是錯的
test =: >: %test 5 1錯誤的原因也很離譜,test 5實際上執行的是5 >: % 5,其中%被翻譯為單目運算符取倒數;>:被翻譯為雙目運算符,用于比較,最后自然 5 > 1 5 5>\frac 1 5 5>51?為真,即返回1。
換言之,:> %在未指定輸入的情況下,是有歧義的。
為了避免這個尷尬的問題,通過@對動詞進行復合是個好辦法
test =: >: @ %test 2 1.5其中,@就起到了函數復合的作用,相當于把函數 f f f和 g g g,變為 f ( g ( x ) ) f(g(x)) f(g(x))。
動詞列表
如果想用同一個動詞,處理多個不同的值,那么可以先用不同的值做一個列表。
% 2 3 4 0.5 0.333333 0.25但是,若想用不同的動詞,處理同一個數值,那可能就不能這么直接列出來了,因為按照J的脾氣,肯定先復合了再說,想做一個動詞列表,那么需要用括號,然后中間用,或者`分隔,類似下面這種
(%, ^) 5 0.2 148.413需要注意,中間的逗號如果沒有的話,那么最終的結果還是復合,只不過換了個復合的方法
% ^ 5 0.00673795(% ^) 5 0.0336897上面執行的計算是 1 e 5 \frac{1}{e^5} e51?,下面執行的運算是 5 / e 5 5/e^5 5/e5,即()把其左側的運算符理解為了雙目計算,并將輸入的5分成兩份分別送到了表達式兩端。
(,)雖然能實現列表,但是這個列表也有一個問題,即無論何時都會一起使用。正常列表,比如[1,2,3],那講道理我把其中的2提取出來專門處理肯定也是沒問題的,但函數上面的函數列表好像不太行。
為了解決這個問題,J語言提供了`…@.語句。
由于`在Markdown中是負責高亮的,所以`自己就沒法高亮了……具體使用方法,直接看下面的代碼
test =: % ` ^(test@.0) 3 0.333333(test@.1) 3 20.0855理解階乘!!
再有了上面這些代碼的積淀之后,只需在知道兩件事就可以看懂階乘的代碼了,這兩件事分別是J語言中的兩類特殊函數。
一類是1:函數,表示常量函數,1:的返回值永遠是1;相應地_3:返回值永遠是-3,這樣的函數共有19個,值從-9到9。
另一類則是創建遞歸函數必不可少的$:,表示調用自身。
接下來就回顧一下階乘代碼
fact=: 1: ` (* $:@<:) @. *其中*用于返回符號,當輸入值x大于1時,* x=1,當輸入值x=0時,* x =0。
如果*x=0,那么fact就選擇左邊的1:函數,此函數無論輸入什么,返回值都是1。
如果*x=1,那么就選擇右側的(* $:@<:),此函數最外層是(* ),將輸入的值 x x x變為x * ($:@<:);$:表示調用自身,:<減一,二者結合就成了f(x-1)。
至此,也就明白了階乘是怎么來的,同時也基本上算是上了J語言的船。
總結
以上是生活随笔為你收集整理的J语言初步,绝妙的符号系统,神的计算器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Q暗色模式适配踩坑—状态
- 下一篇: 【GPT-4】立即停止训练比 GPT-4