Una referencia circular (o ciclo de referencia [1] ) es una serie de referencias donde el último objeto hace referencia al primero, lo que da como resultado un bucle cerrado.
Un recién llegado le pregunta a un vecino dónde está la biblioteca municipal. "Justo enfrente de la oficina de correos", responde el vecino. El recién llegado asiente y añade: "Pero ¿dónde está la oficina de correos?".
"Es muy sencillo", responde el vecino, "¡está justo detrás de la biblioteca!".
No debe confundirse una referencia circular con la falacia lógica de un argumento circular . Aunque una referencia circular a menudo no será útil y no revelará ninguna información, como por ejemplo dos entradas en el índice de un libro que se refieren entre sí, no es necesariamente así que una referencia circular no sea de utilidad. Los diccionarios, por ejemplo, siempre deben ser en última instancia una referencia circular ya que todas las palabras de un diccionario se definen en términos de otras palabras, pero un diccionario sigue siendo, no obstante, una referencia útil. Las oraciones que contienen referencias circulares aún pueden tener sentido:
es circular, pero no sin sentido. De hecho, se puede argumentar que la autorreferencia es una consecuencia necesaria de la Ley de no contradicción de Aristóteles, un axioma filosófico fundamental . Desde este punto de vista, sin la autorreferencia, la lógica y las matemáticas se vuelven imposibles, o al menos, carecen de utilidad. [2] [3]
Las referencias circulares pueden aparecer en la programación informática cuando un fragmento de código requiere el resultado de otro, pero ese código necesita el resultado del primero. Por ejemplo, las dos funciones, posn y plus1 en el siguiente programa de Python comprenden una referencia circular: [ se necesita más explicación ]
def posn ( k : int ) -> int : si k < 0 : devuelve más 1 ( k ) devuelve kdef plus1 ( n : int ) -> int : return posn ( n + 1 )
Las referencias circulares como la del ejemplo anterior pueden devolver resultados válidos si tienen una condición de terminación. Si no hay ninguna condición de terminación, una referencia circular conduce a una condición conocida como bloqueo activo o bucle infinito , lo que significa que, en teoría, podría ejecutarse indefinidamente.
def posn ( k : int ) -> int : return plus1 ( k )def plus1 ( n : int ) -> int : return posn ( n + 1 )
En la norma ISO, las restricciones de integridad circular de SQL se admiten de forma implícita dentro de una única tabla. Entre varias tablas, se permiten restricciones circulares (por ejemplo, claves externas) definiendo las restricciones como diferibles (consulte CREATE TABLE para PostgreSQL y Ejemplos de restricciones DEFERRABLE para Oracle). En ese caso, la restricción se comprueba al final de la transacción, no en el momento en que se ejecuta la sentencia DML. Para actualizar una referencia circular, se pueden emitir dos sentencias en una única transacción que satisfagan ambas referencias una vez que se confirme la transacción.
Las referencias circulares también pueden ocurrir entre instancias de datos de un tipo mutable, como en este script de Python:
mydict = { "esto" : "eso" , "estos" : "esos" } mydict [ "yo mismo" ] = mydict print ( mydict )
La función generará como salida , donde indica una referencia circular, en este caso, al diccionario.print(mydict)
{'this': 'that', 'these': 'those', 'myself': {...}}
{...}
mydict
Las referencias circulares también se producen en las hojas de cálculo cuando dos celdas requieren el resultado de la otra. Por ejemplo, si el valor de la celda A1 se obtiene sumando 5 al valor de la celda B1, y el valor de la celda B1 se obtiene sumando 3 al valor de la celda A1, no se puede calcular ningún valor. (Incluso si las especificaciones son A1:=B1+5 y B1:=A1-5, sigue habiendo una referencia circular. No ayuda que, por ejemplo, A1=3 y B1=-2 satisfagan ambas fórmulas, ya que hay una infinidad de otros valores posibles de A1 y B1 que pueden satisfacer ambas instancias).
La referencia circular en las hojas de trabajo puede ser una técnica muy útil para resolver ecuaciones implícitas como la ecuación de Colebrook y muchas otras, que de otro modo podrían requerir tediosos algoritmos de Newton-Raphson en VBA o el uso de macros. [4]
En los procesos que contienen una referencia circular, conviene distinguir entre aquellos que son incomputables y aquellos que son un cálculo iterativo con un resultado final. Estos últimos pueden fallar en hojas de cálculo que no estén preparadas para manejarlos, pero aun así siguen siendo lógicamente válidos. [3]