Odniesienie okrężne

Odwołanie cykliczne to seria odniesień , w których ostatni obiekt odwołuje się do pierwszego, co skutkuje zamkniętą pętlą.

Odniesienie cykliczne (na czerwono)

Prosty przykład

„Y”, nowicjusz w mieście pyta „Z”, gdzie znajduje się świątynia. „Z” odpowiada: „jest przed pocztą”. Po chwili zastanowienia Y ponownie pyta: „OK, powiedz mi proszę, gdzie jest poczta?” Z odpowiada: „jest przed świątynią!”

w języku

Odwołania cyklicznego nie należy mylić z błędem logicznym argumentu cyklicznego . Chociaż odniesienie cykliczne często będzie nieprzydatne i nie ujawni żadnych informacji, na przykład dwa wpisy w indeksie książek odnoszące się do siebie, niekoniecznie jest tak, że odniesienie cykliczne jest bezużyteczne. Słowniki, na przykład, zawsze muszą ostatecznie być odniesieniem okrężnym, ponieważ wszystkie słowa w słowniku są zdefiniowane w kategoriach innych słów, niemniej jednak słownik pozostaje użytecznym odniesieniem. Zdania zawierające odwołania cykliczne mogą nadal mieć znaczenie:

Jej brat dał jej kotka; jego siostra podziękowała mu za to.

jest okrągły, ale nie bez znaczenia. Rzeczywiście, można argumentować, że samoodniesienie jest konieczną konsekwencją Arystotelesowskiego prawa niesprzeczności , fundamentalnego aksjomatu filozoficznego . Z tego punktu widzenia bez odniesienia do siebie logika i matematyka stają się niemożliwe, a przynajmniej pozbawione użyteczności.

W programowaniu komputerowym

Odwołania cykliczne mogą pojawić się w programowaniu komputerowym , gdy jeden fragment kodu wymaga wyniku z innego, ale ten kod wymaga wyniku z pierwszego. Na przykład dwie funkcje, posn i plus1 w poniższym programie w Pythonie, zawierają odwołanie cykliczne: [ potrzebne dalsze wyjaśnienia ]

    
       0
         
     

    
        def  pozn  (  k  :  int  )  ->  int  :  if  k  <  :  return  plus1  (  k  )  return  k  def  plus1  (  n  :  int  )  ->  int  :  return  pozn  (  n  +  1  ) 

Odwołania cykliczne, takie jak powyższy przykład, mogą zwracać prawidłowe wyniki, jeśli mają warunek kończący. Jeśli nie ma warunku końcowego, odwołanie cykliczne prowadzi do warunku znanego jako livelock lub nieskończona pętla , co oznacza, że ​​teoretycznie może działać w nieskończoność.

    
     

    
        def  pozn  (  k  :  int  )  ->  int  :  return  plus1  (  k  )  def  plus1  (  n  :  int  )  ->  int  :  return  pozn  (  n  +  1  ) 

W standardzie ISO ograniczenia integralności cyklicznej SQL są niejawnie obsługiwane w jednej tabeli. Pomiędzy wieloma tabelami ograniczenia cykliczne (np. klucze obce) są dozwolone poprzez zdefiniowanie ograniczeń jako odroczonych (zobacz CREATE TABLE dla PostgreSQL i DEFERRABLE Constraint Examples dla Oracle). W takim przypadku ograniczenie jest sprawdzane na końcu transakcji, a nie w momencie wykonywania instrukcji DML. Aby zaktualizować odwołanie cykliczne, w jednej transakcji można wydać dwie instrukcje, które spełnią oba odwołania po zatwierdzeniu transakcji.

Odwołania cykliczne mogą również wystąpić między instancjami danych o zmiennym typie, na przykład w tym skrypcie Pythona:

  
   
   

  
 mydict  =  {  "to"  :  "tamto"  ,  "te"  :  "te"  }  mydict  [  "ja"  ]  =  mydict  print  (  mydict  ) 

Funkcja print ( mydict ) wyświetli { 'this' : 'that' , 'these' : 'those' , 'myself' : { ... }} , gdzie { ... } wskazuje odwołanie cykliczne, w tym przypadku , do słownika mydict .

W arkuszach kalkulacyjnych

Odwołania cykliczne występują również w arkuszach kalkulacyjnych , gdy dwie komórki wymagają wzajemnego wyniku. Na przykład, jeśli wartość w komórce A1 ma zostać uzyskana przez dodanie 5 do wartości w komórce B1, a wartość w komórce B1 ma zostać uzyskana przez dodanie 3 do wartości w komórce A1, żadne wartości nie mogą zostać obliczone. (Nawet jeśli specyfikacje to A1:=B1+5 i B1:=A1-5, nadal istnieje odniesienie cykliczne. Nie pomaga to, że na przykład A1=3 i B1=-2 spełniałyby oba wzory, ponieważ istnieje nieskończenie wiele innych możliwych wartości A1 i B1, które mogą spełnić oba przypadki).

Odwołania cykliczne w arkuszach mogą być bardzo użyteczną techniką rozwiązywania niejawnych równań, takich jak równanie Colebrooka i wielu innych, które w przeciwnym razie mogłyby wymagać żmudnych algorytmów Newtona-Raphsona w VBA lub użycia makr.

Należy dokonać rozróżnienia w przypadku procesów zawierających cykliczne odniesienia między tymi, których nie można obliczyć, a tymi, które są obliczeniami iteracyjnymi z końcowym wynikiem. Te ostatnie mogą zawieść w arkuszach kalkulacyjnych, które nie są przystosowane do ich obsługi, ale mimo to są nadal poprawne logicznie.

Zobacz też