ComputersSoftware

RPN: algoritme, werkwijzen en voorbeelden

RPN vormde ooit de basis van een computer programmeur in de wereld. Vandaag is het niet zo bekend. Daarom komische illustratie, afbeelding van een "omgekeerde" Poolse worstenbroodjes buiten, kan nog steeds verkeerd begrepen worden door een aantal deskundige programmeurs. Niet erg goed verklaren de grap, maar in dit geval zal het volledig gerechtvaardigd zijn.

infix

Alle programmeurs, en de meeste studenten zijn vertrouwd met het gebruik van de exploitanten. Bijvoorbeeld de uitdrukking x + somwaardes voor de variabelen x en y gebruikte plusteken. Minder bekend is het feit dat dit is ontleend aan de wiskunde notatie, genaamd infix notatie, in feite, is een groot probleem voor de machines. Deze operator ontvangt als invoer twee waarden worden op de linker en rechter. In de programmering gebruikt notatie optioneel met tekenen operaties. Zo kan x + y worden geschreven als een functie van de vouw (x, y), waarbij de compiler en uiteindelijk omgezet infix notatie. Maar iedereen weet dat de wiskunde is te goed rekenkundige expressies, die een soort van interne mini-taal te vormen in bijna elke programmeertaal niet te gebruiken.

formule vertaler

De eerste echt succesvol Fortran programmeertaal is zo grotendeels omdat de rekenkundige expressie (dwz formule ..) Het omgezet (broadcast) in de code, vandaar de naam ervan - Formule vertaling. Daarvoor moesten ze schrijven, bijvoorbeeld gevouwen in de vorm van functies (en vermenigvuldigen (b, c)). In COBOL probleem van de implementatie van automatische conversie formule werd beschouwd als zeer moeilijk omdat de programmeurs gehad om dingen zoals toevoegen A naar B mutliply door C. schrijven

Wat is er mis met infix?

Het probleem is, dat de exploitanten hebben dergelijke eigenschappen als prioriteit en associativiteit. Vanwege dit, de definitie van infix functie wordt niet-triviale taak. Bijvoorbeeld vermenigvuldiging heeft een hogere prioriteit dan optellen of aftrekken, waardoor de expressie 2 + 3 * 4 niet gelijk is aan de som van 2 en 3, vermenigvuldigd met 4, zoals bij de uitvoering van de exploitanten worden van links naar rechts. In feite, vermenigvuldigt 3 bij 4 en voeg 2. Dit voorbeeld illustreert dat de berekening van de inhechtsel expressie vereist vaak een verandering in de volgorde van de operatoren en operanden. Daarnaast is het noodzakelijk om beugels te gebruiken om meer duidelijk notatie kijken. Zo kan bijvoorbeeld (2 + 3) * (4 + 5) niet worden geschreven zonder de haakjes, want 2 + 3 * 4 + 5 betekent dat je nodig hebt om te vermenigvuldigen 3 bij 4 en voeg 2 en 5.

De volgorde waarin u de operators berekenen vereist een lang herinneren. Vanwege dit, studenten die beginnen te leren rekenen, krijgen vaak de verkeerde resultaten, zelfs als de feitelijke handelingen correct worden uitgevoerd. Het is noodzakelijk om de volgorde van optreden verklaringen te leren uit het hoofd. Ten eerste, de actie moet plaatsvinden tussen haakjes, dan vermenigvuldigen en delen, en ten slotte optellen en aftrekken uitgevoerd. Maar er is een andere manier van het schrijven van wiskundige uitdrukkingen als infix notatie is slechts één van de mogelijke "kleine talen", die meer kunnen worden toegevoegd.

Prefix en postfix notatie

Twee van de meest bekende alternatieven voor de operator op te nemen voor of na de operanden. Ze staan bekend als de prefix en postfix notatie. Logicus Yan Lukasevich de uitvinder van de eerste in 1920. Hij woonde in Polen, waardoor de plaat heet het Pools. Postfix versie, respectievelijk, de zogenaamde Reverse Polish Notation (ARF). Het enige verschil tussen deze beide werkwijzen is de richting waarin het kan worden gelezen (van links naar rechts of rechts naar links), zodat het voldoende te overwegen in detail slechts een van hen. De OPN operator is geschreven na de operanden. Dus de uitdrukking AB + is een voorbeeld RPN voor A + B.

Onbeperkt aantal operanden

De directe voordeel van notatie is dat het overzicht van de n-adische operator en infix notatie is eigenlijk alleen werkt met twee operanden, t. E. zijn inherent alleen geschikt voor binaire operatie. Bijvoorbeeld ABC @ is omgekeerd Poolse expressie met behulp triadic merk dat de maximale waarde van A, B en C. In dit geval is de gebruiker werkt aan de linkerkant van de drie operand zelf en komt overeen met een functieaanroep @ (A, B, C). Als u probeert om het @ -symbool als infix, schrijf zoals A @ BC of iets dergelijks, wordt duidelijk dat het gewoon niet werkt.

De prioriteit die de order

RPN heeft nog een voordeel in dat de prioriteit van de operatoren kan worden voorgesteld door de volgorde van hun uiterlijk. Op hetzelfde moment nooit meer bretels, hoewel ze kunnen worden opgenomen als personages behandelingen om de conversie van infix notatie te vergemakkelijken. Bijvoorbeeld AB + C * - eenduidig equivalent (A + B) * C, zodat de vermenigvuldiging niet worden berekend totdat de toevoeging uitgevoerd, waarbij een tweede operand voor vermenigvuldiging geeft. Dat wil zeggen, als de berekende AB + C * door één operator per keer, krijgen we AB + C * -> (AB +) * C -> (A + B) * C.

berekening algoritme

De OPN operator ziet er hetzelfde uit als een functie die neemt als argumenten twee waarden op haar linker geschreven. Bovendien is het een natuurlijke notatie voor gebruik in programmeertalen, zoals het bij de berekening overeen met de stapel operaties en de noodzaak voor het ontleden geëlimineerd. Zo zal de afleider in de expressie 5 + 6 * 7 weergegeven als een 5, 6, 7 * +, en kan eenvoudig worden berekend door het scannen van links naar rechts en schrijf de waarden in een stapel. Wanneer een gemeenschappelijk teken van de werking, geselecteerd door het bovenste element 2 van het computergeheugen, de operator wordt gebruikt en het resultaat weer in het geheugen. Wanneer het eindresultaat van de berekening expressie in de top van de stack.

Bijvoorbeeld:

  • S = () 5, 6, 7, *, + 5 geplaatst op de stapel.
  • S = (5) 6, 7, *, + 6 geplaatst op de stapel.
  • S = (5, 6), 7 *, 7 + plaats de stapel.
  • S = (5, 6, 7), * 2 + kiezen waarden uit de stapel gebruik * en plaats het resultaat in de stapel.
  • S = (5, 6 * 7) = (5, 42) +2 waarden die op de stapel, de + passen en zet het resultaat in de stapel.
  • S = (5 + 42) = (47) berekening is voltooid, wordt het resultaat opgeslagen in de bovenkant van de stapel.

Dit algoritme kan herhaaldelijk worden gecontroleerd RPN, maar elke keer dat het zal werken, maakt niet uit hoe complex de rekenkundige expressie.

OPN en stapels nauw met elkaar verbonden. Dit voorbeeld laat zien hoe u het geheugen te gebruiken om de waarde van de omgekeerde Poolse notatie berekenen. Minder voor de hand liggende is dat je de stapel kunt gebruiken, het omzetten van standaard infix-expressie in acuut nierfalen.

Voorbeelden van programmeertalen

Pascal RPN gerealiseerd deze trant (toont het deel van het programma).

De getallen en operatoren gelezen in de cyclus genaamd procedure die bepaalt of het kaartnummer of tekenoperatie. In het eerste geval wordt het opgeslagen in de stapel waarde en de tweede van de twee bovenste stapel nummers die overeenkomen actie uitgevoerd en het resultaat wordt opgeslagen.

toktype: = num;

lees (s);

Als c in [ '+', '-' '*', '/'] dan beginnen

als dan eoln cn: = '' anders gelezen (CN);

Als cn = '' dan

Bij een

'+': Toktype: = toe te voegen; '-': toktype: = sub;

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

einde

anders beginnen

als a = '-' dan sgn: = -1 anders fout: = c <> '+';

met: = cn

einde

end;

if (geen fout) en (toktype = num) dan getnumber;

Als toktype <> num dan beginnen

y = pop; x: = pop;

zo niet fout was, dan

Bij toktype van

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

einde

push (z);

C-implementatie RPN (weergegeven deel van het programma):

voor (s = strtok (s, w); s; s = strtok (0, w)) {

a = strtod (s, en e);

if (e> s) push (a);

#define rpnop (x) printf ( "% c:", * s), b = pop (), a = pop (), push (x)

else if (* s == '+') rpnop (a + b);

else if (* s == '-') rpnop (a - b);

else if (* s == '*') rpnop (a * b);

else if (* s == '/') rpnop (a / b);

#undef rpnop

}

hardware-implementaties

In die dagen, toen computertechnologie was erg duur, dacht men een goed idee om mensen te dwingen afleiders gebruiken. In 1960-er jaren., Zoals nu, was het mogelijk om de rekenmachines, die werken in omgekeerde Poolse notatie te kopen. Om toe te voegen 2 en 3 van hen moet 2, vervolgens 3 in te voeren, en druk op de "plus" knop. Op het eerste gezicht, de ingang operands aan de exploitant leek ingewikkeld en moeilijk te onthouden, maar na een tijdje sommige zijn verslaafd aan deze manier van denken en kon niet begrijpen waarom de anderen aandringen op domme tussenvoegsel, die zo ingewikkeld en zo is beperkt.

Burroughs bedrijf zelfs bouwde een mainframe, die geen ander geheugen had, behalve stack. Het enige dat de machine maakt - de toegepaste algoritmen en werkwijzen RPN het centrale stack. Al haar activiteiten werden als afleiders operators, die geldt voor de bovenste n waarden. Bijvoorbeeld, het team heeft het retouradres van de top van de stapel, en ga zo maar door. D. De architectuur van een dergelijke machine was eenvoudig, maar niet snel genoeg om te concurreren met de meest voorkomende architecturen. Velen, echter nog steeds spijt van het feit dat een dergelijke eenvoudige en elegante benadering van het gebruik, waarbij elk programma was een uiting van OPN, vond zijn voortzetting.

Eén keer calculators met RPN waren populair, en sommige mensen nog steeds geven ze de voorkeur. Daarnaast ontwikkelden zij een stapel georiënteerde talen zoals Forth. Vandaag is het weinig gebruikt, maar nog steeds nostalgisch van zijn vroegere gebruikers.

Dus wat is de betekenis van grappen over Reverse Polish worst?

Als we aannemen dat de exploitant van de worst, de infix notatie, moet binnen de rol zijn zoals bij conventionele hot dog. De RPN ligt midden in twee helften klaar daartussen na berekening. Nu komt het moeilijke deel - mosterd. Ze is al op de worst, t. E. al berekend als een unaire operator. Gemeend wordt dat mosterd ook worden weergegeven als uncalculated en moet daarom worden verplaatst naar de rechterkant van de worst ... Het is echter mogelijk, zou dit een te grote stapel nodig ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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