Cirkulär referens
En cirkulär referens är en serie referenser där det sista objektet refererar till det första, vilket resulterar i en sluten slinga.
Enkelt exempel
"Y", frågar en nykomling i en stad "Z" var templet är. "Z" svarar, "det är framför postkontoret." Efter en stunds begrundande frågar Y igen: "OK, snälla säg mig, var är postkontoret?" Z svarar, "det är framför templet!"
På språket
En cirkulär referens ska inte förväxlas med den logiska felaktigheten i ett cirkulärt argument . Även om en cirkulär hänvisning ofta är ohjälpsam och inte avslöjar någon information, till exempel två poster i ett bokregister som hänvisar till varandra, är det inte nödvändigtvis så att en cirkulär hänvisning inte är till någon nytta. Ordböcker måste till exempel alltid i slutändan vara en cirkulär referens eftersom alla ord i en ordbok definieras i termer av andra ord, men en ordbok förblir ändå en användbar referens. Meningar som innehåller cirkulära referenser kan fortfarande vara meningsfulla:
- Hennes bror gav henne en kattunge; hans syster tackade honom för det.
är cirkulär, men inte utan mening. Det kan faktiskt hävdas att självreferens är en nödvändig konsekvens av Aristoteles lag om icke-motsägelse, ett grundläggande filosofiskt axiom . I detta synsätt, utan självreferens, logik och matematik omöjliga, eller saknar åtminstone användbarhet.
I datorprogrammering
Cirkulära referenser kan förekomma i datorprogrammering när ett stycke kod kräver resultatet från ett annat, men den koden behöver resultatet från den första. Till exempel omfattar de två funktionerna, posn och plus1 i följande Python-program en cirkulär referens: [ ytterligare förklaring behövs ]
0
def posn ( k : int ) -> int : if k < : return plus1 ( k ) return k def plus1 ( n : int ) -> int : return posn ( n + 1 )
Cirkulära referenser som exemplet ovan kan returnera giltiga resultat om de har ett avslutande villkor. Om det inte finns något avslutande tillstånd leder en cirkulär referens till ett tillstånd som kallas livelock eller infinite loop , vilket innebär att det teoretiskt sett kan köra för evigt.
def posn ( k : int ) -> int : return plus1 ( k ) def plus1 ( n : int ) -> int : return posn ( n + 1 )
I ISO Standard stöds cirkulära SQL-integritetsbegränsningar implicit i en enda tabell. Mellan flera tabeller är cirkulära begränsningar (t.ex. främmande nycklar) tillåtna genom att definiera begränsningarna som deferrable (Se CREATE TABLE för PostgreSQL och DEFERRABLE Constraint Exempel för Oracle). I så fall kontrolleras begränsningen i slutet av transaktionen, inte vid den tidpunkt då DML-satsen exekveras. För att uppdatera en cirkulär referens, kan två uttalanden utfärdas i en enda transaktion som kommer att uppfylla båda referenserna när transaktionen är genomförd.
Cirkulära referenser kan också hända mellan instanser av data av en föränderlig typ, som i detta Python-skript:
mydict = { "detta" : "det där" , "dessa" : "dessa" } mydict [ "jag själv" ] = mydict print ( mydict )
Print { ( mydict )
-funktionen kommer att mata ut { 'this' : 'that' , 'these' : 'dessa' , 'jag själv' : referens ... }}
, där { ... } indikerar en cirkulär
, i detta fall , till mydict-
ordboken.
I kalkylblad
Cirkulära referenser förekommer också i kalkylblad när två celler kräver varandras resultat. Till exempel, om värdet i cell A1 ska erhållas genom att addera 5 till värdet i cell B1, och värdet i cell B1 ska erhållas genom att addera 3 till värdet i cell A1, kan inga värden beräknas. (Även om specifikationerna är A1:=B1+5 och B1:=A1-5, finns det fortfarande en cirkulär referens. Det hjälper inte att till exempel A1=3 och B1=-2 skulle uppfylla båda formlerna, som det finns oändligt många andra möjliga värden för A1 och B1 som kan uppfylla båda fallen.)
Cirkulär referens i kalkylblad kan vara en mycket användbar teknik för att lösa implicita ekvationer som Colebrook-ekvationen och många andra, som annars kan kräva tråkiga Newton-Raphson- algoritmer i VBA eller användning av makron.
En åtskillnad bör göras med processer som innehåller en cirkulär hänvisning mellan de som är oberäkningsbara och de som är en iterativ beräkning med en slutlig utdata. Det senare kan misslyckas i kalkylblad som inte är utrustade för att hantera dem men är ändå logiskt giltiga.
Se även
- Kausalitet – Hur en process påverkar en annan
- Cirkulär rapportering – Flera källor för data från en källa
- Stoppa problem – Problem med att avgöra om ett visst program kommer att sluta köras eller fortsätta för alltid
- Kapslad funktion – I datorprogrammering, en funktion definierad inom en annan funktion
- Quine (dator) – Självreplikerande program
- Regressargument – Problem inom epistemologin att vilken proposition som helst kan ifrågasättas oändligt
- Självreferens – mening, idé eller formel som refererar till sig själv
- There's a Hole in My Bucket – Barnsång