What are the names of custom operators in F#?

Infix, Prefix & Postfix Notationer Forklaret

21/05/2004

Rating: 4.84 (13249 votes)

Matematiske formler og aritmetiske udtryk er en fundamental del af vores hverdag, selvom vi ikke altid tænker over det. Den måde, vi typisk skriver dem på, med operatorer som plus og minus placeret mellem tallene, virker intuitiv for os mennesker. Denne metode kaldes infix-notation. Men for en computer kan denne notation være ineffektiv og kompleks at fortolke, især når parenteser kommer i spil. For at optimere beregninger og gøre processen mere strømlinet for maskiner, har matematikere og dataloger udviklet alternative notationsformer: prefix og postfix. I denne artikel vil vi udforske disse tre forskellige måder at skrive og evaluere matematiske udtryk på, og vi vil se på, hvordan og hvorfor de bruges.

What are infix expressions in arithmetic?
Infix expressions are the most usual type of expression. This notation is typically employed when writing arithmetic expressions by hand. Moreover, in the infix expression, we place the operator between the two operands it operates on. For example, the operator “+” appears between the operands A and B in the expression “A + B”.
Indholdsfortegnelse

Hvad er Infix-udtryk?

Infix-udtryk er den notationsform, de fleste af os er bekendt med fra skolen. Det er den standardmåde, vi skriver matematiske udtryk på. I denne notation placeres operatoren (f.eks. +, -, *, /) direkte mellem de to operander (de tal eller variable, den virker på). Et simpelt eksempel er udtrykket A + B, hvor plus-operatoren befinder sig mellem operanderne A og B.

En af de vigtigste, men også mest udfordrende, aspekter ved infix-notation er behovet for regler, der styrer rækkefølgen af operationer. Uden klare regler ville et udtryk som 5 + 6 * 2 være tvetydigt. Betyder det (5 + 6) * 2 = 22, eller betyder det 5 + (6 * 2) = 17? For at løse denne tvetydighed anvender vi regler for operatorprioritet. Disse regler specificerer, hvilke operatorer der skal evalueres før andre.

Regler for Operatorprioritet

Den generelle hierarki for evaluering af operatorer i de fleste programmeringssprog og matematiske systemer er som følger:

  • Parenteser: Udtryk inde i parenteser evalueres altid først. De kan bruges til at tilsidesætte de normale prioriteringsregler.
  • Eksponentiering: Potensopløftning (f.eks. x^y) udføres som det næste.
  • Multiplikation og Division: Disse operationer har samme prioritet og udføres før addition og subtraktion.
  • Addition og Subtraktion: Disse operationer har den laveste prioritet og udføres til sidst.

Hvad sker der, hvis et udtryk indeholder flere operatorer med samme prioritet, som f.eks. i 10 - 4 + 2? I sådanne tilfælde anvendes en associativitetsregel, som typisk er fra venstre mod højre. Det betyder, at operationerne udføres i den rækkefølge, de optræder i udtrykket. For 10 - 4 + 2 vil det være (10 - 4) + 2 = 8.

Prefix-udtryk: Operatoren Først

Prefix-udtryk, også kendt som Polsk notation, er en alternativ måde at skrive udtryk på, hvor operatoren placeres før sine operander. For eksempel ville det infix-udtryk A + B blive skrevet som + A B i prefix-notation. Det kan virke mærkeligt i starten, men denne notation har en stor fordel: den eliminerer fuldstændigt behovet for parenteser og regler om operatorprioritet. Rækkefølgen af operationer er utvetydigt bestemt af operatorernes position.

For at evaluere et prefix-udtryk læser man det typisk fra højre mod venstre. Når man støder på en operator, anvendes den på de to næste operander, man møder. For eksempel, i udtrykket * + 5 6 2, ville evalueringen foregå således: man ser operatoren '+', og dens operander er '5' og '6'. Resultatet (11) erstatter + 5 6, så udtrykket bliver til * 11 2. Derefter udføres multiplikationen, hvilket giver 22.

Postfix-udtryk: Operatoren Sidst

Postfix-udtryk, ofte kaldet Omvendt Polsk notation (Reverse Polish Notation, RPN), er en anden parentesfri notation. Her placeres operatoren efter sine operander. Vores simple eksempel A + B bliver til A B + i postfix. Ligesom prefix-notation er postfix også utvetydig og kræver ingen parenteser.

Postfix-udtryk er særligt interessante, fordi de er meget nemme at evaluere for en computer ved hjælp af en simpel datastruktur kaldet en stak. Man læser udtrykket fra venstre mod højre. Når man støder på en operand (et tal), skubbes den op på stakken. Når man støder på en operator, tager man de to øverste operander fra stakken, udfører operationen og skubber resultatet tilbage på stakken. Når hele udtrykket er gennemgået, vil det endelige resultat være det eneste element tilbage på stakken. Denne effektivitet gør postfix-notation meget populær i kompilatorer og lommeregnere.

Sammenligning af de Tre Notationer

Hver notationsform har sine egne styrker og svagheder, som gør dem velegnede til forskellige formål. Valget af notation afhænger ofte af, om målet er menneskelig læsbarhed eller maskinel effektivitet.

EgenskabInfix-notationPrefix-notationPostfix-notation
Menneskelig læsbarhedHøj (det vi er vant til)Lav (kræver tilvænning)Lav (kræver tilvænning)
Behov for parenteserJa, for at styre prioritetNej, er utvetydigNej, er utvetydig
BeregningseffektivitetLav (kræver kompleks parsing)Høj (simpel at parse)Meget høj (ideel til stak-baserede maskiner)
AnvendelsesområderAlmindelig matematik, de fleste programmeringssprogNogle programmeringssprog (f.eks. Lisp), kompilatorteoriKompilatorer, stack-baserede lommeregnere (f.eks. HP), PostScript

Konvertering fra Infix til Postfix

Da postfix-notation er så effektiv for computere at evaluere, er en almindelig opgave i datalogi at konvertere et infix-udtryk til dets postfix-ækvivalent. Denne proces udføres typisk ved hjælp af en algoritme, der involverer en stak (en LIFO - Last-In, First-Out datastruktur).

Processen for konvertering kan opsummeres i følgende trin:

  1. Opret en tom stak til operatorer og en tom streng til output (postfix-udtrykket).
  2. Gennemgå infix-udtrykket fra venstre mod højre, tegn for tegn.
  3. Hvis tegnet er en operand (et tal eller en variabel), tilføjes det direkte til output-strengen.
  4. Hvis tegnet er en operator, sammenlignes dens prioritet med operatoren øverst på stakken. Så længe operatoren på stakken har højere eller samme prioritet, tages den fra stakken og tilføjes til output. Derefter skubbes den nye operator op på stakken.
  5. Hvis tegnet er en venstre-parentes '(', skubbes den på stakken.
  6. Hvis tegnet er en højre-parentes ')', tages operatorer fra stakken og tilføjes til output, indtil en venstre-parentes '(' findes. Parenteserne kasseres.
  7. Når hele infix-udtrykket er gennemgået, tømmes stakken for eventuelle resterende operatorer, som tilføjes til output.

Lad os tage eksemplet 5 + 6 * 2 - 3 / 2. Ved at følge algoritmen vil det blive konverteret til postfix-udtrykket 5 6 2 * + 3 2 / -. Dette udtryk kan en computer nu evaluere meget simpelt fra venstre mod højre uden at bekymre sig om prioriteringsregler.

Ofte Stillede Spørgsmål (FAQ)

Hvorfor bruger computere ikke bare infix-notation, som mennesker gør?

Computere kan godt arbejde med infix-notation, men det kræver en mere kompleks proces kaldet parsing. Parseren skal analysere hele udtrykket, identificere operatorer og operander, og bygge en intern struktur (som et udtrykstræ) baseret på reglerne for operatorprioritet og parenteser. Dette er beregningsmæssigt dyrere end den simple, lineære evaluering af et postfix-udtryk med en stak.

Hvilken notation er "bedst"?

Der er ikke én notation, der er universelt "bedst". Det afhænger fuldstændigt af konteksten. For menneskelig interaktion og læsbarhed er infix uovertruffen. For effektiv maskinel evaluering, især i simple systemer som lommeregnere eller i kompilatorers mellemliggende faser, er postfix ofte det foretrukne valg.

Anvendes disse alternative notationer i den virkelige verden?

Ja, absolut. Postfix-notation (RPN) var berømt for at blive brugt i Hewlett-Packards videnskabelige lommeregnere, som mange ingeniører og forskere sværgede til på grund af dens hastighed og effektivitet. I dag er det en fundamental del af, hvordan kompilatorer og fortolkere for programmeringssprog som C++, Java og Python internt håndterer og evaluerer matematiske udtryk. Sprog som PostScript, der bruges til at beskrive sider i print, er også baseret på en stak og bruger postfix-notation.

Konklusion

Infix, prefix og postfix er tre forskellige måder at repræsentere den samme matematiske logik. Mens vi som mennesker finder infix-notationen med dens operatorer mellem tallene mest intuitiv, tilbyder prefix- og især postfix-notationer en elegance og effektivitet, der er skræddersyet til computere. At forstå forskellene mellem dem giver ikke kun indsigt i, hvordan vores digitale værktøjer fungerer under overfladen, men fremhæver også den smukke sammenhæng mellem abstrakt matematik og praktisk databehandling.

Hvis du vil læse andre artikler, der ligner Infix, Prefix & Postfix Notationer Forklaret, kan du besøge kategorien Teknologi.

Go up