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.

Cirkulär referens (i rött)

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