Круговая ссылка
Циклическая ссылка (или ссылочный цикл [1] ) представляет собой серию ссылок , в которой последний объект ссылается на первый, что приводит к замкнутому циклу.
Простой пример
[ редактировать ]Приезжий спрашивает местного жителя, где находится городская библиотека. «Прямо перед почтой», — говорит местный житель. Новичок кивает и продолжает: «А где почта?»
«Да ведь это просто», — отвечает местный житель. «Это сразу за библиотекой!»
На языке
[ редактировать ]Циклическую ссылку не следует путать с логической ошибкой циклического аргумента . Хотя циклическая ссылка часто бесполезна и не раскрывает никакой информации, как, например, две записи в указателе книг, ссылающиеся друг на друга, это не обязательно означает, что циклическая ссылка бесполезна. Словари, например, всегда должны представлять собой циклическую ссылку, поскольку все слова в словаре определяются через другие слова, но словарь, тем не менее, остается полезным справочником. Предложения, содержащие циклические ссылки, могут иметь смысл:
- Брат подарил ей котенка; его сестра поблагодарила его за это.
круговой, но не лишенный смысла. Действительно, можно утверждать, что самореференция является необходимым следствием Закона непротиворечия Аристотеля , фундаментальной философской аксиомы . С этой точки зрения, без самореференции логика и математика становятся невозможными или, по крайней мере, бесполезными. [2] [3]
В компьютерном программировании
[ редактировать ]Циклические ссылки могут появляться в компьютерном программировании , когда один фрагмент кода требует результата из другого, но этому коду нужен результат из первого. Например, две функции posn и plus1 в следующей программе Python содержат циклическую ссылку: [ нужны дальнейшие объяснения ]
def posn(k: int) -> int:
if k < 0:
return plus1(k)
return k
def 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 = {
"this": "that",
"these": "those"
}
mydict["myself"] = mydict
print(mydict)
The 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]
См. также
[ редактировать ]- Причинность – как один процесс влияет на другой.
- Циклическая отчетность – несколько источников для данных из одного источника
- Проблема остановки - проблема определения того, завершит ли данная программа работу или будет продолжать работать вечно.
- Вложенная функция – именованная функция, определенная внутри функции.
- Quine (вычисления) - Самовоспроизводящаяся программа
- Аргумент регресса — философская проблема.
- Самореференция - предложение, идея или формула, которая ссылается на себя.
- В моем ведре дырка - классическая юмористическая детская песенка.
Ссылки
[ редактировать ]- ^ Клабник, Стив; Николс, Кэрол. «Опорные циклы могут привести к утечке памяти» . Язык программирования Rust . Команда Руста . Проверено 8 ноября 2023 г.
- ^ Терри А. Осборн , Будущее образования иностранных языков в Соединенных Штатах , стр. 31-33, Greenwood Publishing Group, 2002 г. ISBN 0-89789-719-6 .
- ^ Jump up to: а б Роберт Фьенго, Роберт Мэй, Индексы и идентичность , стр. 59–62, MIT Press, 1994 г. ISBN 0-262-56076-3 .
- ^ , Анилкумар М., доктор Шринивасан Э. и доктор Рагунатан К. «Решите неявные уравнения внутри вашего рабочего листа » Архивировано из оригинала 17 августа 2009 г. Проверено 25 июня 2009 г. .