La petite histoire
Tarjan , un célèbre informaticien , a écrit un livre il y a plusieurs années. Il contient un pseudo-code absolument bizarre. Quelqu'un pourrait-il s'il vous plaît l'expliquer?
La longue histoire
Tarjan est connu pour de nombreuses réalisations, notamment le fait qu'il était le co-inventeur des arbres évasés . Il a publié un livre intitulé " Structures de données et algorithmes de réseau " dans les années 1980.
Tous les pseudo-codes du livre de Tarjan sont écrits dans un langage qu'il a lui-même conçu. Les conventions de pseudo-code sont très strictes. C'est presque un vrai langage, et on pourrait imaginer écrire un compilateur pour cela. Tarjan écrit que son langage est basé sur les trois suivants:
J'espère qu'une personne connaissant une ou deux des langues ci-dessus, ou le travail de Tarjan, pourra répondre à ma question.
Un exemple de fonction écrite dans la langue de Tarjan est présenté ci-dessous:
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;
J'ai vu beaucoup de pseudo-codes, mais je n'ai jamais rien vu de semblable à Tarjan. Comment fonctionne le pseudocode de Tarjan? Comment des exemples du pseudo-code de Tarjan peuvent-ils être réécrits en quelque chose qui ressemble plus à C ou à Java? Il n'est même pas nécessaire que ce soit C ou Java. La construction if-else dans la langue de Tarjan est non seulement différente des langues de la famille C, mais également de Python, MATLAB et bien d'autres.
la source
return
déclaration se termine-t-elle vraiment par une virgule?Réponses:
Table des matières
Je diviserai mon explication du pseudocode de Tarjan dans les sections suivantes:
->
&|
):=
et=
)else if
, mais pas deelse
construction:= if
Exemples supplémentaires de Tarjan
if
et:= if
5.5. Tarjan Arrays (ou Listes)
Résumé des opérateurs
⟷
)(1) Les blocs If-else de Tarjan
(les opérateurs
→
et|
)La
if-else
construction est peut-être la structure de contrôle la plus fondamentale dans le langage de Tarjan. En plus des if-blocks de type C, le comportement if-else est pratiquement intégré aux assignations de Tarjan et aux boucles while de Tarjan. L'opérateur de flèche de Tarjan->
(ou →) est un délimiteur entre la condition d'une instruction if et le bloc d'exécution d'une instruction if.Par exemple, dans le langage de Tarjan, nous pourrions avoir:
Si nous traduisons partiellement la ligne de code Tarjan ci-dessus en C ou en Java, nous obtenons ce qui suit:
Au lieu d'une accolade droite (comme en C et Java), Tarjan termine un
if
bloc par une orthographe inversée du type mot-clé ALGOL:fi
Si nous continuons à traduire notre exemple ci-dessus, nous obtenons:
(2) Tests d'assignation et d'égalité (
:=
et=
)Tarjan prend ces opérateurs d'ALGOL (plus tard également vu en Pascal).
Tarjan utilise
=
pour des tests d'égalité, pas des assignations (donc ça fonctionne comme Java==
).Pour les affectations, Tarjan utilise
:=
, qui fonctionne comme Java=
.Ainsi, si nous continuons à traduire notre exemple, nous avons:
Une barre verticale (ou "pipe" ou
|
) dans la langue de Tarjan équivaut auelse if
mot - clé en C ou en Java.Par exemple, dans le langage de Tarjan, nous pourrions avoir:
Le code Tarjan ci-dessus se traduit par:
(3)
else if
seulement et pas deelse
constructionUn peu plus tôt, je
if
couvrais les bases des déclarations sans décrire les nuances. Cependant, nous ne discuterons pas d'un petit détail. La dernière clause d'unif-else
bloc Tarjan-ian doit toujours contenir un→
opérateur arrow ( ). En tant que tel, il n'y a pas queelse
dans la langue de Tarjanelse if
. La chose la plus proche d'unelse
bloc dans la langue de Tarjan est de créer la condition de test la plus appropriéetrue
.En C / Java, nous aurions:
Les exemples sont plus faciles à comprendre que les descriptions générales. Cependant, maintenant que nous avons quelques exemples à notre actif, sachez que la structure générale d'une construction if-else de Tarjan est la suivante:
Le personnage
|
est commeif else
Le caractère
→
sépare la condition de test de la tâche à accomplir.(4) Opérateur d'affectation conditionnelle de Tarjan
:= if
Tarjan
if
peut être utilisé de deux manières très différentes. Jusqu'à présent, nous n'avons décrit qu'une des utilisations du tarjanienif
. De manière quelque peu déroutante, Tarjan utilise toujours la notation / syntaxeif
pour le second type deif
-construct. Ce quiif
est utilisé est basé sur le contexte. Analyser le contexte est en fait très facile à faire car le second type de Tarjanif
est toujours pré-fixé par un opérateur d’attribution.Par exemple, nous pourrions avoir le code Tarjan suivant:
Commencer la digression
Après avoir utilisé le code Tarjan pendant un certain temps, vous vous habituez à l'ordre des opérations. Si nous donnons la condition de test entre parenthèses dans l'exemple ci-dessus, nous obtenons:
a = 4
n'est pas une opération d'affectation.a = 4
est commea == 4
- il retourne vrai ou faux.Mettre fin à la digression
Il peut être utile d’envisager la
:= if
syntaxe d’un opérateur unique, distincte de:=
etif
En fait, nous ferons référence à l’:= if
opérateur en tant qu’opérateur "d’affectation conditionnelle".Pour
if
nous lister(condition → action)
. Car:= if
nous listons(condition → value)
oùvalue
est la valeur du côté droit que nous pourrions attribuer au côté gauchelhs
en C ou en Java pourrait ressembler à:
Prenons l'exemple suivant "d'assignation conditionnelle" en code tarjanien:
# Instanciation de Tarjan de l'exemple cinq x: = a = 4 → 9 | a> 4 → 11 | vrai → 99 fi
En C / Java, nous aurions:
(5) Résumé des opérateurs:
Jusqu'à présent, nous avons:
:=
...... Opérateur d'affectation (C / Java=
)=
...... Test d'égalité (C / Java==
)→
...... Délimiteur entre la condition de test d'un bloc if et le corps d'un bloc if|
..... C / Java sinon-siif ... fi
..... si-sinon bloquer:= if... fi
..... Affectation conditionnelle basée sur un bloc if-else(5.5) Listes / Tableaux Tarjan:
Tarjan's Language intègre des conteneurs de type tableau. La syntaxe des tableaux de Tarjan est beaucoup plus intuitive que la notation des
if else
déclarations de Tarjan .Les éléments de tableau de Tarjan sont accessibles entre parenthèses
()
et non entre crochets[]
L'indexation commence à
1
. Ainsi,Vous trouverez ci-dessous comment créer un nouveau tableau contenant les 1er et 5ème éléments de
[1, 2, 3, 4, 5, 6, 7]
L'opérateur d'égalité est défini pour les tableaux. Le code suivant imprime
true
Le moyen utilisé par Tarjan pour vérifier si un tableau est vide consiste à le comparer à un tableau vide.
On peut créer une vue (et non une copie) d’un sous-tableau, en fournissant plusieurs indices à l’opérateur
()
associé à..
(6) Exemples supplémentaires de Tarjan
if
et:= if
Voici un autre exemple d'assignation conditionnelle Tarjan (
:= if
):(true --> b)
est la(cond --> action)
clause la plus à gauche ayant une condition vraie. Ainsi, l'affectation d'origine, exemple six, a le même comportement d'affectation quea := b
Vous trouverez ci-dessous notre exemple le plus complexe de code Tarjan à ce jour:
Ce qui suit est une traduction du code de Tarjan pour la fusion de deux listes triées. Ce qui suit n'est pas exactement C ou Java, mais il est beaucoup plus proche de C / Java que la version Tarjan.
Vous trouverez ci-dessous un autre exemple de code Tarjan et une traduction similaire à C ou Java:
Ci-dessous, la traduction C / Java:
(7) Opérateur de flèche à double pointe de Tarjan (
<-->
)Voici un exemple de code Tarjan:
Que fait un
⟷
opérateur en double flèche ( ) dans la langue de Tarjan?Eh bien, presque toutes les variables de la langue de Tarjan sont des indicateurs.
<-->
est une opération d'échange. Les impressions suivantestrue
Après avoir terminé
x <--> y
,x
pointe vers l’objet quiy
pointait et pointeray
vers l’objet quix
était pointé.Ci-dessous, une déclaration de Tarjan utilisant l'
<-->
opérateur:Ci-dessous, une traduction du code Tarjan ci-dessus en pseudocode alternatif:
Alternativement, nous pourrions avoir:
Vous trouverez ci-dessous un exemple de fonction de Tarjan utilisant l'
⟷
opérateur:Ci-dessous, une traduction de la
mesh
fonction de Tarjan en pseudo-code qui n'est pas C, mais qui ressemble plus à C (relativement parlant). Ceci a pour but d'illustrer le fonctionnement de l'⟷
opérateur de Tarjan .(8) Les boucles de Tarjan sont comme des boucles en boucle C / Java
Le langage
if
et lesfor
constructions de Tarjan sont familiers aux programmeurs C / Java. Cependant, le mot clé Tarjan pour une boucle while estdo
. Toutes lesdo
boucles se terminent par le mot-cléod
, qui est l'orthographe en arrière dedo
. Ci-dessous un exemple:Dans le pseudocode de style C, nous avons:
Ce qui précède n’est pas tout à fait correct. Une boucle de Tarjan est vraiment un C / Java
while(true)
avec un bloc if-else imbriqué à l'intérieur. Une traduction plus littérale du code Tarjan est la suivante:Ci-dessous, nous avons une
do
boucle de Tarjan plus compliquée :Le pseudocode de style C / Java pour la
do
boucle compliquée de Tarjan est le suivant:(9) Opérateur d'assignation conditionnelle de Tarjan avec toutes les conditions fausses
Bien que la longue explication ci-dessus couvre la plupart des choses, il reste quelques questions en suspens. J'espère que quelqu'un d'autre écrira un jour une nouvelle réponse améliorée basée sur la mienne qui répond à ces dilemmes.
Notamment, lorsque l'opérateur d'affectation conditionnelle
:= if
est utilisé et qu'aucune condition n'est vraie, je ne sais pas quelle valeur est affectée à la variable.Je ne suis pas sûr, mais il est possible qu'aucune cession ne soit faite à
x
:Vous pouvez exiger que la variable de gauche vue dans une
:= if
instruction soit déclarée auparavant. Dans ce cas, même si toutes les conditions sont fausses, la variable aura toujours une valeur.Sinon, peut-être que toutes les conditions fausses représentent une erreur d'exécution. Une autre alternative consiste à renvoyer une
null
valeur spéciale et à stockernull
l'argument de gauche de l'affectation.la source
=
comparaison est synonyme d'affectation (si j'écrivais une langue, j'en commettrais une erreur de syntaxe et je n'avais que:=
et==
). D'autre part, l'opérateur de swap est le genre de chose qui ne se produirait que dans des langages spécialisés où il s'agissait d'une opération courante; dans d’autres langues, vous pouvez simplement assumer une fonction de bibliothèque appeléeswap
et remplacerh1 ⟷ h2
parswap(h1, h2)
plutôt que d’écrire l’implémentation à chaque fois.[1, 2] = [1, 2, 3, 4, 5]
vrai?|
opérateur est un gardien . Ils sont utilisés en Haskell (et je crois d’autres langages fonctionnels) dans les définitions de fonctions:f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
voiciotherwise
un alias pourTrue
etf
définit les nombres de fibonacci.Jamais vu cela auparavant, mais je pense pouvoir déduire ce que l'on entend par contexte. On suppose que l'opération
⟷
doit être une opération d'échange. Ilif G1 -> S1 | G2 - >S2 | ... fi
s'agit d'une construction de type if / then / else qui renvoie également une valeur, comme l'?:
opérateur ternaire en C et Java.Avec cette main en main, nous pourrions écrire la fonction ci-dessus dans un langage semblable à Java:
la source