KomputilojProgramaro

RPN: algoritmo, metodoj kaj ekzemploj

RPN iam formis la bazon de komputila programisto en la mondo. Hodiaŭ ne estas tiel bone konata. Tial, komika ilustraĵo, prezentanta "inversigi" pola kolbaso ruloj ekstere, povas ankoraŭ esti miskomprenata de iuj spertaj programistoj. Ne tre bone klarigas la ŝercon, sed en ĉi tiu kazo estos plene pravigita.

infikso

Ĉiuj programistoj, kaj plej studentoj bone konas la uzon de la telefonistoj. Ekzemple, la esprimo x + sumado valoroj por la variabloj x kaj y uzata plus signo. Malpli konata estas la fakto, ke tiu estas pruntita de matematiko notacio, nomita infikso notacio, fakte, estas granda problemo por la maŝinoj. Ĉi operatoro ricevas kiel enigo du valoroj estas registritaj sur la maldekstra kaj dekstra. En programado notacio uzata laŭvole kun signoj operacioj. Ekzemple, x + y povas esti skribita kiel funkcio de faldo (x, kaj), en kiu la tradukilo kaj eventuale konvertas infikso notacio. Tamen, ĉiu scias la matematiko estas tro bona ne uzi aritmetikaj esprimoj, kiuj formas specon de interna mini- lingvo en preskaŭ ĉiu programlingvo.

formulo tradukisto

La unua vere sukcesa Fortran programlingvo fariĝis tiel plejparte pro la aritmetika esprimo (te formulo ..) Ĝi konvertiĝis (broadcast) en la kodo, tial la nomo de ĝi - formulo traduko. Antaŭ tio, ili devis skribi, ekzemple, faldita en la formo de funkcioj (kaj multobligi (b, c)). En COBOL problemo de implementar aŭtomata konvertiĝo formulo estis konsiderita tre malfacila ĉar la programistoj devis skribi aĵojn kiel Aldoni A Por B Mutliply By C.

Kio malĝustas kun infikso?

La problemo estas, ke la telefonistoj havas tiajn proprietojn kiel prioritaton kaj asocieco. Pro tio, la difino de infikso funkcio iĝas ne-bagatela tasko. Ekzemple, multipliko havas pli altan prioritaton ol aldono aŭ subtraho, kio signifas ke la esprimo 2 + 3 * 4 estas ne egala al la sumo de 2 kaj 3, multiplikita de 4, kiel estus en la agado de la telefonistoj de maldekstre dekstren. Fakte, multobligi 3 per 4 kaj aldoni 2. Ĉi tiu ekzemplo ilustras, ke la kalkulo de la infikso esprimo ofte postulas ŝanĝon en la ordo de operatoroj kaj argumentoj. Krome, estas necese uzi krampoj rigardi pli klara skribmaniero. Ekzemple, (2 + 3) * (4 + 5) ne povas esti skribita sen la krampoj, ĉar 2 + 3 * 4 + 5 signifas ke vi devas multobligi 3 per 4 kaj aldoni 2 kaj 5.

La ordo kiun vi volas kalkuli la telefonistoj postulas longan memoras. Pro tio, studentoj kiuj komencas lerni aritmetikon, ofte akiras la malĝustan rezultojn, eĉ se la reala operacioj estas faritaj ĝuste. Estas necese instrui la ordon de agado deklaroj parkere. Unue, la ago devas esti efektivigita en krampoj, do multipliko kaj divido, kaj fine adicio kaj subtraho. Sed ekzistas alia maniero skribi matematikaj esprimoj kiel infikso notacio estas nur unu el la eblaj "malgrandaj lingvoj" kiuj povas esti aldonitaj al pli.

Prefikso kaj postfix notation

Du el la plej konataj alternativoj estas gravuri la operatoro antaŭ aŭ post lia argumentoj. Ili estas konataj kiel la prefikso kaj postfix skribmaniero. Logikisto Yan Lukasevich inventis la unua unu en 1920. Li vivis en Pollando, do la disko estas nomita pola. Postfix versio, respektive, nomita Inversa pola Notacio (ARF). La sola diferenco inter tiuj du metodoj estas la direkto en kiu legi la registro (de maldekstra al dekstra aŭ dekstra al maldekstra), do sufiĉas konsideri detale nur unu el ili. La OPN operatoro estas skribita post lia argumentoj. Tiel, la esprimo AB + reprezentas ekzemplon RPN por A + B.

Senlima nombro de argumentoj

La tuja avantaĝo de notacio estas, ke ĝi resumas la n-_adic_ operatoro kaj infikso notacio estas vere nur funkcias kun du argumentoj, t. E. Ĉu esence taŭgas nur por duumaj operacioj. Ekzemple, ABC @ estas la inversa pola esprimo uzas triadic markon kiu estas la maksimuma valoro de A, B kaj C. En ĉi tiu kazo la operatoro agas sur la maldekstra el la tri argumento mem kaj korespondas al funkcio alvoko @ (A, B, C). Se vi provas skribi la @ simbolo kiel infikso, kiel ekzemple A @ aK aŭ io simila, ĝi iĝas klare, ke ĝi simple ne funkcias.

La prioritato donita de la ordo

RPN havas alian avantaĝon en ke la prioritato de la operatoroj povas esti reprezentitaj per la ordo de ilia aspekto. Samtempe neniam bezonas krampoj, kvankam ili povas esti inkluditaj kiel karakteroj operacioj por faciligi la konvertiĝo de infikso notacio. Ekzemple, AB + C * - unusenca ekvivalenta (A + B) * C, do la multipliko povas esti kalkulita ĝis la aldono farita, kiu donas duan argumento por multipliko. Tio estas, se la kalkulita AB + C * de unu operatoro en tempo, ni akiras AB + C * -> (AB +) * C -> (A + B) * C.

kalkulo algoritmo

La OPN operatoro aspektas la sama kiel funkcio kiu preno kiel argumentoj du valoroj skribita sur la maldekstra. Krome, ĝi estas natura skribmaniero por uzo en programlingvoj, kiel estas la kutimo de lia cómputo respondas al la pilo operacioj kaj la bezono de analiza estas eliminita. Ekzemple, la arrester en la esprimo 5 + 6 * 7 aperos kiel 5, 6, 7 *, +, kaj ĝi povas esti kalkulita nur per skanado de maldekstre dekstren kaj skribi la valoroj en pilo. Kiam ajn komuna signo de operacio, selektita de la supra elemento 2 de la komputilo memoro, la operatoro estas uzata kaj la rezulto revenis al memoro. Kiam la fina rezulto de la ŝtono esprimo estos en la supro de la stako.

Ekzemple:

  • S = () 5, 6, 7, *, + 5 metita sur la stako.
  • S = (5) 6, 7, *, + 6 metita sur la stako.
  • S = (5, 6), 7 *, 7 + meti la pilo.
  • S = (5, 6, 7), * 2 + elektu valoroj de la pilo, uzo * kaj meti la rezulton en la pilo.
  • S = (5, 6 * 7) = (5, 42) + 2 valoroj elektitaj el la pilo, por apliki la + kaj sendis la rezulton en la pilo.
  • S = (5 + 42) = (47) kalkulo estas kompletigita, la rezulto estas stokita en la supro de la stako.

Tiu algoritmo povas esti kontrolata RPN ripete, sed ĉiufoje ĝi funkcios, kiel ajn kompleksa la aritmetika esprimo.

OPN kaj stakoj estas proksime ligitaj. Tiu ekzemplo montras kiel uzi la memoro por kalkuli la valoron de la inversa pola notacio. Malpli evidente estas, ke vi povas uzi la pilo, gxojigas normo infikso esprimo en akra rena fiasko.

Ekzemploj de programlingvoj

Pascal RPN realigitaj tiel (montras la parton de la programo).

Por legi la nombroj kaj operatoroj en la ciklo nomata procedo, kiu difinas ĉu la signo nombro aŭ signo operacio. En la unua kazo, la valoro stokita en la pilo, kaj la dua de la du supraj pilo nombroj responda ago estas farata kaj la rezulto estas stokita.

toktype: = num;

legi (j);

se c en [ '+', '-', '*', '/'] tiam komenci

se eoln tiam cn: = '' alie legi (cn);

se cn = '' tiam

Ĉe

'+': Toktype: = aldoni; '-': toktype: = sub;

'*': Toktype: = mul; '/': Toktype: = div

fino

alia komenci

se a = '-' tiam sgn: = -1 alie eraro: = c <> '+';

kun: = cn

fino

fini;

se (ne eraro) kaj (toktype = num) tiam getnumber;

se toktype <> num tiam komenci

y = popmuziko; x: = popmuziko;

se ne eraro tiam

kazo toktype de

aldoni: z: = x + y; sub: z: = x-y; mul: z: = x * y; div: z: = x / y

fino

puŝo (z);

C-efektivigo RPN (montrita parto de la programo):

por (j = strtok (j, w); s; s = strtok (0, w)) {

al = strtod (s, & Kaj);

se (e> j) puŝo (a);

#define rpnop (x) printf ( "% c:", * s), b = pop (), al = pop (), puŝon (x)

alie se (* s == '+') rpnop (a + b);

alie se (* s == '-') rpnop (a - b);

alie se (* s == '*') rpnop (a * b);

alie se (* s == '/') rpnop (a / b);

#undef rpnop

}

aparataro implementaciones

En tiu tempo, kiam komputila teknologio estis tre multekosta, oni pensis bona ideo por devigi homojn uzi ondadon arestantojn. En 1960-ies., Kiel nun, oni povis aĉeti la kalkuliloj, kiuj laboras en inversa pola notacio. Por aldoni 2 kaj 3 el ili devas eniri 2, tiam 3, kaj premu la "pli" butono. Al unua vido, la enigo argumentoj al la operatoro ŝajnis komplika kaj malfacila memori, sed post kelka tempo iuj estas toksomaniulo al ĉi pensmanieron kaj ne povis kompreni kial la aliaj insistas pri stulta infikso, kiu estas tiom komplika kaj tiel estas limigita.

Burroughs kompanio eĉ konstruis mainframe, kiu ne havis aliajn memoro, krom pilo. La sola afero, kiu faras la maŝinon - aplikis la algoritmoj kaj metodoj RPN al la centra pilo. Ĉiuj de liaj operacioj estis konsiderata kiel arestantojn operatoroj, kiuj validas por la supra n valorojn. Ekzemple, la teamo prenis la Reveni Adreso de la supro de la pilo, kaj tiel plu. D. La arkitekturo de tia maŝino estis simpla, sed ne sufiĉe rapide por konkurenci kun la pli komunaj arkitekturoj. Multaj tamen ankoraŭ bedaŭras la fakton, ke tia simpla kaj eleganta aliro al komputado kie ĉiu programo estis esprimo de OPN, trovis lia daŭrigo.

Unu fojon kalkuliloj kun RPN estis popularaj, kaj kelkaj homoj ankoraŭ al ili preferon. Krome, ili evoluigis pilo orientitaj lingvoj, kiel ekzemple la Forth. Hodiaŭ ĝi estas iom uzata, sed ankoraŭ nostalgia de sia iama uzantoj.

Do kio estas la signifo ŝercoj pri Inversa pola kolbaso?

Se ni supozas ke la operatoro de la kolbaso, la infikso notacio, ĝi devus esti ene de la rulo kiel en konvencia varma hundo. La RPN estas lokita en plena du duonoj preparu therebetween post kalkulo. Nun venas la malfacilan parton - mustardo. Ŝi estas jam sur la kolbaso, t. E. Jam kalkulita kiel unuloka operatoro. Oni kredas ke mustardo devus ankaŭ esti montrita kiel uncalculated kaj tial devus esti movita al la rajto de la kolbaso ... Sed eblas, tio postulus tro granda stako de ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 eo.atomiyme.com. Theme powered by WordPress.