Cerpen
Seorang ilmuwan komputer terkenal, Tarjan , menulis sebuah buku bertahun-tahun yang lalu. Ini berisi kodesemu yang benar-benar aneh. Apakah seseorang tolong jelaskan?
Kisah Panjang
Tarjan dikenal dengan banyak prestasi, termasuk fakta bahwa ia adalah seorang coinventor dari pohon-pohon hamparan . Dia menerbitkan sebuah buku, " Struktur Data dan Algoritma Jaringan ," selama 1980-an.
Semua kode semu dalam buku Tarjan ditulis dalam bahasa yang dirancangnya sendiri. Konvensi kode semu sangat ketat. Itu hampir merupakan bahasa yang benar, dan orang bisa membayangkan menulis kompiler untuk itu. Tarjan menulis bahwa bahasanya didasarkan pada tiga berikut:
Saya berharap seseorang yang akrab dengan satu atau dua bahasa di atas, atau karya Tarjan, akan dapat menjawab pertanyaan saya.
Contoh fungsi yang ditulis dalam bahasa Tarjan ditunjukkan di bawah ini:
heap function mesh (heap nodes h1, h2);
if key(h1) > key(h2) → h1 ⟷ h2 fi;
right (h1) := if right(h1) = null → h2
|right(h1) ≠ null → mesh (right(h1), h2) fi;
if rank (left (h1)) < rank (right (h1)) → left(h1) ⟷ right(h1) fi;
rank (h1) := rank(right(h1)) + 1;
return h1,
end mesh;
Saya telah melihat banyak kode semu, tetapi saya belum pernah melihat yang seperti Tarjan. Bagaimana cara kerja pseudocode Tarjan? Bagaimana contoh pseudocode Tarjan dapat ditulis ulang sebagai sesuatu yang lebih mirip C atau Java? Bahkan tidak perlu C atau Java. Konstruksi if-else dalam bahasa Tarjan tidak hanya berbeda dari bahasa C-family, tetapi juga berbeda dari Python, MATLAB dan banyak lainnya.
sumber
return
pernyataan itu benar-benar berakhir dengan koma?Jawaban:
Daftar Isi
Saya akan membagi penjelasan saya tentang pseudocode Tarjan menjadi bagian-bagian berikut:
->
&|
):=
dan=
)else if
, tetapi tidak adaelse
konstruksi:= if
Contoh Tambahan Tarjan's
if
dan:= if
5.5. Tarjan Arrays (atau Daftar)
Ringkasan Operator
⟷
)(1) Blok If-else Tarjan
(operator
→
dan|
)The
if-else
membangun mungkin yang paling struktur pengendalian mendasar dalam bahasa Tarjan ini. Selain C-like if-blok, perilaku if-else hampir tertanam di dalam tugas Tarjan dan loop sementara Tarjan. Operator panah Tarjan->
(atau →) adalah pembatas antara kondisi pernyataan-if dan blok eksekusi pernyataan-if.Misalnya, dalam bahasa Tarjan kita mungkin memiliki:
Jika kami menerjemahkan sebagian kode Tarjan di atas ke dalam C atau Java, kami mendapatkan yang berikut:
Alih-alih kurung kurawal kanan (seperti di C dan Jawa) Tarjan mengakhiri
if
-block dengan ejaan mundur-seperti ALGOL dari kata kunci:fi
Jika kami terus menerjemahkan contoh kami di atas, kami mendapatkan:
(2) Tes Penugasan dan Kesetaraan (
:=
dan=
)Tarjan mengambil operator ini dari ALGOL (kemudian juga terlihat dalam Pascal).
Tarjan digunakan
=
untuk tes kesetaraan, bukan tugas (sehingga berfungsi seperti Java==
).Untuk tugas, Tarjan menggunakan
:=
, yang berfungsi seperti Java=
.Jadi, jika kita terus menerjemahkan contoh kita, kita memiliki:
Bilah vertikal (atau "pipa" atau
|
) dalam bahasa Tarjan setara denganelse if
kata kunci dalam C atau Java.Misalnya, dalam bahasa Tarjan kita mungkin memiliki:
Kode-Tarjan di atas diterjemahkan menjadi:
(3)
else if
hanya dan tanpaelse
konstruksiSebelumnya, saya membahas dasar-dasar
if
pernyataan tanpa menjelaskan nuansa. Namun, kami tidak akan membahas detail kecil. Klausa terakhir dalamif-else
blok Tarjan-ian harus selalu berisi→
operator panah ( ). Dengan demikian, tidak adaelse
dalam bahasa Tarjan, hanyaelse if
. Hal yang paling dekat denganelse
-block dalam bahasa Tarjan adalah membuat kondisi tes paling kanantrue
.Di C / Java, kita akan memiliki:
Contoh lebih mudah dipahami daripada deskripsi umum. Namun, sekarang kita memiliki beberapa contoh di bawah ikat pinggang kita, ketahuilah bahwa formal umum dari konstruksi if-else Tarjan adalah sebagai berikut:
Karakternya
|
sepertiif else
Karakter
→
memisahkan kondisi uji dari hal-hal yang harus dilakukan.(4) Operator Tugas Bersyarat Tarjan
:= if
Tarjan
if
dapat digunakan dua cara yang sangat berbeda. Sejauh ini, kami hanya menggambarkan salah satu kegunaan Tarjanianif
. Agak membingungkan, Tarjan masih menggunakan notasi / sintaksif
untuk tipeif
-construct kedua . Yangif
digunakan didasarkan pada konteks. Menganalisis konteks sebenarnya sangat mudah dilakukan karena tipe kedua dari Tarjan-if
selalu diperbaiki oleh operator penugasan.Misalnya, kami mungkin memiliki kode Tarjan berikut:
Mulailah Digression
Setelah bekerja dengan kode Tarjan untuk sementara, Anda terbiasa dengan urutan operasi. Jika kami mengurung kondisi pengujian dalam contoh di atas, kami memperoleh:
a = 4
bukan operasi penugasan.a = 4
sepertia == 4
- mengembalikan benar atau salah.Akhiri Digression
Dapat membantu untuk menganggapnya
:= if
sebagai sintaks untuk satu operator, berbeda dari:=
danif
pada kenyataannya, kami akan menyebut:= if
operator sebagai operator "penugasan bersyarat".Untuk
if
kita daftar(condition → action)
. Untuk:= if
kami daftar di(condition → value)
manavalue
nilai sisi kanan kami dapat menetapkan untuk sisi kirilhs
di C atau Java mungkin terlihat seperti:
Pertimbangkan contoh "penugasan kondisional" berikut dalam kode bahasa Tarjan:
# Instansiasi Tarjan dari Contoh Lima x: = a = 4 → 9 | a> 4 → 11 | benar → 99 fi
Di C / Java, kita akan memiliki:
(5) Ringkasan Operator:
Sejauh ini, kami memiliki:
:=
...... Operator penugasan (C / Java=
)=
...... Tes kesetaraan (C / Java==
)→
...... Pembatas antara kondisi uji blok-if dan tubuh blok-if|
..... C / Java lain-jikaif ... fi
..... jika-lagi blok:= if... fi
..... Tugas bersyarat berdasarkan pada blok if-else(5.5) Daftar / Array Tarjan:
Bahasa Tarjan memiliki wadah mirip array bawaan. Sintaks untuk array Tarjan jauh lebih intuitif daripada notasi untuk
if else
pernyataan Tarjan .Elemen array Tarjan diakses dengan tanda kurung
()
, bukan tanda kurung[]
Pengindeksan dimulai pada
1
. Demikian,Di bawah ini menunjukkan cara membuat array baru yang mengandung elemen 1 dan 5
[1, 2, 3, 4, 5, 6, 7]
Operator kesetaraan didefinisikan untuk array. Kode berikut dicetak
true
Cara Tarjan untuk menguji apakah array kosong adalah membandingkannya dengan array kosong
Seseorang dapat membuat tampilan (bukan salinan) dari sebuah sub-array, dengan menyediakan beberapa indeks untuk
()
digabungkan dengan operator..
(6) Contoh Tambahan dari Tarjan
if
dan:= if
Berikut ini adalah contoh lain dari penugasan bersyarat Tarjan (
:= if
):(true --> b)
adalah(cond --> action)
klausa paling kiri yang memiliki kondisi sebenarnya. Dengan demikian, tugas asli Contoh Enam memiliki tugas-perilaku yang sama dengana := b
Berikut ini adalah contoh kode Tarjan kami yang paling rumit:
Berikut ini adalah terjemahan kode Tarjan untuk menggabungkan dua daftar yang diurutkan. Berikut ini bukan C atau Java, tetapi lebih dekat ke C / Java daripada versi Tarjan.
Di bawah ini adalah contoh lain dari kode-Tarjan dan terjemahan dalam sesuatu yang mirip dengan C atau Java:
Di bawah ini adalah terjemahan C / Java:
(7) Operator Panah Runcing Dua (
<-->
)Di bawah ini adalah contoh kode Tarjan:
Apa yang
⟷
Dilakukan oleh Operator Double Arrow ( ) dalam Bahasa Tarjan?Yah, hampir semua variabel dalam Bahasa Tarjan adalah pointer.
<-->
adalah operasi swap. Cetakan berikuttrue
Setelah melakukan
x <--> y
, arahkan kex
objek yangy
digunakan untuk menunjuk dany
menunjuk ke objek yangx
digunakan untuk menunjuk.Di bawah ini adalah pernyataan Tarjan menggunakan
<-->
operator:Di bawah ini adalah terjemahan dari kode Tarjan di atas ke pseudocode alternatif:
Atau, kita dapat memiliki:
Di bawah ini adalah contoh dari salah satu fungsi Tarjan menggunakan
⟷
operator:Di bawah ini adalah terjemahan dari
mesh
fungsi Tarjan menjadi pseudo-code yang bukan C, tetapi lebih mirip C (secara relatif berbicara). Tujuannya adalah untuk menggambarkan cara⟷
kerja operator Tarjan .(8) Do-loop Tarjan seperti C / Java while-loop
Bahasa
if
danfor
konstruk Tarjan tidak asing bagi programmer C / Java. Namun, kata kunci Tarjan untuk while-loop adalahdo
. Semuado
-loop diakhiri dengan kata kunciod
, yang merupakan ejaan mundur darido
. Di bawah ini adalah contohnya:Dalam pseudocode C-style, kami memiliki:
Di atas sebenarnya tidak sepenuhnya benar. Do-loop Tarjan sebenarnya adalah C / Java
while(true)
dengan blok if-else yang bersarang di dalamnya. Terjemahan kode Tarjan yang lebih harfiah adalah sebagai berikut:Di bawah, kami memiliki Tarjan
do
-loop yang lebih rumit :Kode semu gaya Java untuk tarjan
do
-loop yang rumit adalah sebagai berikut:(9) Operator penugasan bersyarat Tarjan dengan semua kondisi salah
Meskipun penjelasan panjang di atas mencakup sebagian besar hal, beberapa hal masih belum terselesaikan. Saya berharap bahwa orang lain suatu hari nanti akan menulis jawaban baru yang lebih baik berdasarkan milik saya yang menjawab pertanyaan ini.
Khususnya, ketika operator penugasan bersyarat
:= if
digunakan, dan tidak ada kondisi yang benar, saya bukan nilai apa yang ditugaskan untuk variabel.Saya tidak yakin, tetapi mungkin saja tidak ada tugas yang dilakukan untuk
x
:Anda bisa meminta agar variabel sisi kiri yang terlihat dalam
:= if
pernyataan dideklarasikan sebelumnya. Dalam hal itu, bahkan jika semua kondisi salah, variabel masih akan memiliki nilai.Atau, mungkin semua kondisi false merupakan kesalahan runtime. Alternatif lain adalah mengembalikan
null
nilai khusus , dan menyimpannyanull
di argumen sebelah kiri penugasan.sumber
=
perbandingan berarti di mana itu berarti tugas (jika saya pernah menulis bahasa, saya akan membuatnya menjadi kesalahan sintaks, dan hanya memiliki:=
dan==
). Di sisi lain, operator swap adalah jenis hal yang hanya akan terjadi dalam bahasa khusus di mana ia merupakan operasi yang umum; dalam bahasa lain, Anda hanya bisa mengasumsikan fungsi pustaka yang dipanggilswap
dan digantih1 ⟷ h2
denganswap(h1, h2)
alih - alih menuliskan implementasi setiap waktu.[1, 2] = [1, 2, 3, 4, 5]
benar?|
operator adalah penjaga . Mereka digunakan dalam Haskell (dan saya percaya bahasa fungsional lainnya) dalam definisi fungsi: dif x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
siniotherwise
adalah alias untukTrue
danf
mendefinisikan angka-angka fibonacci.Belum pernah melihat ini sebelumnya, tetapi saya pikir saya dapat menyimpulkan apa yang dimaksud dari konteks .. Agaknya
⟷
harus operasi swap, danif G1 -> S1 | G2 - >S2 | ... fi
merupakan konstruksi if / then / else-type yang juga mengembalikan nilai, seperti?:
operator ternary di C dan Java.Dengan itu di tangan kita bisa menulis fungsi di atas dalam bahasa mirip Java seperti:
sumber