Циклическая ссылка (или ссылочный цикл [1] ) — это серия ссылок , в которой последний объект ссылается на первый, что приводит к замкнутому циклу.
Приезжий спрашивает местного жителя, где находится городская библиотека. «Прямо перед почтой», — говорит местный житель. Новичок кивает и продолжает: «А где почта?»
«Да ведь это просто», — отвечает местный житель. «Это сразу за библиотекой!»
Циклическую ссылку не следует путать с логической ошибкой циклического аргумента . Хотя циклическая ссылка часто бывает бесполезной и не раскрывает никакой информации, как, например, две записи в указателе книг, ссылающиеся друг на друга, это не обязательно означает, что циклическая ссылка бесполезна. Словари, например, всегда должны представлять собой циклическую ссылку, поскольку все слова в словаре определяются через другие слова, но словарь, тем не менее, остается полезным справочником. Предложения, содержащие циклические ссылки, могут иметь смысл:
круговой, но не лишенный смысла. Действительно, можно утверждать, что самореференция является необходимым следствием Закона непротиворечия Аристотеля , фундаментальной философской аксиомы . С этой точки зрения, без самореференции логика и математика становятся невозможными или, по крайней мере, бесполезными. [2] [3]
Циклические ссылки могут появляться в компьютерном программировании , когда один фрагмент кода требует результата из другого, но этому коду нужен результат из первого. Например, две функции, posn и plus1 в следующей программе Python, представляют собой циклическую ссылку: [ необходимо дальнейшее объяснение ]
def posn ( k : int ) -> int : если k < 0 : return plus1 ( k ) return kdef plus1 ( n : int ) -> int : return posn ( n + 1 )
Циклические ссылки, подобные приведенному выше примеру, могут возвращать действительные результаты, если у них есть завершающее условие. Если условие завершения отсутствует, циклическая ссылка приводит к состоянию, известному как livelock или бесконечный цикл , что означает, что теоретически оно может выполняться вечно.
def posn ( k : int ) -> int : return plus1 ( k )def plus1 ( n : int ) -> int : return posn ( n + 1 )
В стандарте ISO ограничения циклической целостности SQL неявно поддерживаются в пределах одной таблицы. Между несколькими таблицами разрешены циклические ограничения (например, внешние ключи), если определить ограничения как отложенные (см. CREATE TABLE для PostgreSQL и Примеры ограничений DEFERRABLE для Oracle). В этом случае ограничение проверяется в конце транзакции, а не во время выполнения оператора DML. Чтобы обновить циклическую ссылку, в одной транзакции можно выполнить два оператора, которые удовлетворят обе ссылки после фиксации транзакции.
Циклические ссылки также могут возникать между экземплярами данных изменяемого типа, как, например, в этом скрипте Python:
mydict = { "это" : "это" , "эти" : "те" } mydict [ "сам" ] = mydict print ( mydict )
Функция выведет , где указывает на циклическую ссылку, в данном случае на словарь.print(mydict)
{'this': 'that', 'these': 'those', 'myself': {...}}
{...}
mydict
Циклические ссылки также встречаются в электронных таблицах , когда двум ячейкам требуются результаты друг друга. Например, если значение в ячейке A1 должно быть получено путем добавления 5 к значению в ячейке B1, а значение в ячейке B1 должно быть получено путем добавления 3 к значению в ячейке A1, никакие значения вычислить невозможно. (Даже если спецификациями являются A1:=B1+5 и B1:=A1-5, все равно существует циклическая ссылка. Не помогает то, что, например, A1=3 и B1=-2 удовлетворяют обеим формулам, как существует бесконечно много других возможных значений A1 и B1, которые могут удовлетворять обоим случаям.)
Круговая ссылка в рабочих листах может быть очень полезным методом решения неявных уравнений, таких как уравнение Колбрука и многих других, которые в противном случае могли бы потребовать утомительных алгоритмов Ньютона-Рафсона в VBA или использования макросов. [4]
Следует проводить различие между процессами, содержащими циклическую ссылку, между процессами, которые невычислимы, и процессами, которые представляют собой итеративные вычисления с конечным результатом. Последнее может дать сбой в электронных таблицах, не оборудованных для их обработки, но, тем не менее, они все еще логически действительны. [3]