¿Cuál es la diferencia entre "recursividad" y "autorreferencia"?

8

Los artículos de wikipedia son demasiado avanzados para que yo los entienda, ¿alguien podría darme una explicación simple, por favor?

calavera
fuente
2
No son términos realmente comparables. recursionse refiere a una función que se llama a sí misma, mientras que se self-referencerefiere a un objeto que hace referencia a sí mismo.
Jakob Weisblat
2
@GerryMyerson, ¿sería correcto decir que la recursividad se llama a sí misma; mientras que la autorreferencia se refiere a sí misma?
skullpatrol
1
@skullpatrol esencialmente sí, pero siento que te falta una diferencia fundamental: no se pueden aplicar al mismo tipo de cosas.
Jakob Weisblat
1
No. La autorreferencia se refiere a un objeto que hace referencia a sí mismo (consulte el artículo de Wikipedia sobre OOP), mientras que la recursión se refiere a una función o método, no a un objeto.
Jakob Weisblat
44
@ Jake223 Sé de dónde vienes, pero también podrías decir que una estructura como una lista vinculada está definida recursivamente (la definición tiene un caso base y un paso recursivo), y no hay duda de que las funciones recursivas son autorreferenciales .
Caleb

Respuestas:

14

El contexto de los dos términos es generalmente diferente.

La referencia automática está en el contexto de los datos: tiene un tipo de datos que contiene una referencia a algo del mismo tipo.

Recursivo está en el contexto del código: tiene una función o procedimiento que se llama a sí mismo.

Ejemplo:

def factorial(n):
if n == 1:
    return 1
else:
    return n * factorial(n-1)
jmoreno
fuente
Estas son las dos definiciones de etiquetas en Stack Overflow: La recursividad en informática es un método de resolución de problemas donde la solución a un problema depende de soluciones a instancias más pequeñas del mismo problema. La autorreferencia es la capacidad de un programa (u oración lógica) para referirse a sí mismo, ya sea directa o indirectamente.
skullpatrol
Y para las etiquetas, eso parece correcto. No desea entrar en casos de esquina extraños para una etiqueta. Y probablemente también se trata del nivel en el que quieres pensar ahora.
jmoreno
10

Aquí hay una función recursiva (en C):

unsigned int fibonacci(unsigned int n)
{
    unsigned int result = 1;

    if (n > 1)
        result = fibonacci(n - 1) + fibonacci(n - 2);

    return result;
}

Esas dos llamadas al fibonacci()interior de la fibonacci()función son llamadas recursivas .

Aquí hay una estructura de datos autorreferencial :

struct ListNode {
    char *data;
    struct ListNode *next;
}

El primer elemento, dataes solo un puntero a algún tipo de datos. El segundo elemento, nextes un puntero a otra ListNodeestructura. Si tiene dos o más ListNodeestructuras, puede configurar el nextpuntero de una a la dirección de otra, y así sucesivamente, y luego tiene una lista vinculada . La estructura es autorreferencial porque la definición de la estructura se refiere a sí misma. Si quieres volverte loco, puedes hacer esto:

struct ListNode *node = malloc(sizeof(struct ListNode));
node->data = someString;
node->next = node;

Ahora tiene un tipo diferente de autorreferencia: no es solo la definición de lo struct ListNodeque se refiere a sí mismo ... ha establecido el nextpuntero nodepara que apunte a nodesí mismo. Esta es una lista circular vinculada que contiene solo un elemento. Lindo, pero no muy útil. Lo menciono porque es una especie de autorreferencia, pero no es lo que la gente suele decir cuando hablan de tipos de datos autorreferenciales.

Caleb
fuente
1
¿Es correcto decir que la recursión es un caso especial de autorreferencia donde el objeto al que se hace referencia (o se llama) es una función?
skullpatrol
2
Claro, se podría decir que una llamada recursiva es una forma de auto referencia. A veces los términos son casi intercambiables, aunque no con respecto al código. Por ejemplo, la mayoría de las personas llamarían "GNU" un "acrónimo recursivo" porque significa "GNU no es Unix", pero nadie diría que se equivocó si lo llamara "acrónimo autorreferencial".
Caleb
@Caleb Este no es un ejemplo particularmente bueno, porque List es un tipo de datos recursivo . ¡Así que en realidad estás mostrando otro ejemplo de recursión!
Andres F.
@AndresF. ¿Puede dar un ejemplo de una estructura de datos autorreferencial que no sea un tipo de datos recursivo? Fuentes como esta y esta usan el término 'autorreferencial' para estructuras como listas enlazadas, mientras que otras usan 'recursivo'. Si mi respuesta no logra hacer una distinción clara entre los términos, es porque los términos no son exactamente sinónimos, pero tienen un significado muy cercano.
Caleb
@Caleb Vaya, lo siento. Si estás diciendo que tienen un significado muy cercano, ¡entonces estamos de acuerdo y te he entendido mal!
Andres F.
6

Se espera que las recursiones, en su mayoría útiles, terminen después de cierto número de procedimientos en el sentido de que hay algún valor inicial. a menos que tenga una mala recursión que sea inútil.

Las auto-referencias, en sí mismas, no son exactamente recursiones, pero se puede demostrar que tienen recursividad, en cuyo caso generalmente nunca terminan.


fuente
55
Si define la recursividad como una construcción que se lleva a cabo sobre una relación bien fundada, entonces el hecho de que una recursión no finalice corresponde a una secuencia decreciente infinita y, por lo tanto, la "recursión" autorreferencial no es en absoluto una recursividad. Esto es muy parecido a cómo se requiere un algoritmo para detenerse en algún momento.
55
¿Qué pasa con esta declaración: "Esta oración tiene cinco palabras". Es autorreferencial, pero no veo ninguna recursión no determinante. Tampoco creo que la recursión en general tenga que implicar autorreferencia. Si compila una función C recursiva en código de máquina binario, el código de máquina no tiene ninguna referencia propia. Creo que lo máximo que puede decir es que una autorreferencia final es una forma posible de definir una recurrencia.
2
Sí, esta es mi explicación de ninguna manera perfecta. Solo estoy tratando de simplificar en caso de que "OP esté tratando de interpretar algunas auto-referencias como recuras". De ninguna manera quiero decir que las auto-referencias son siempre recursiones sin terminación.
¿Es correcto decir que la recursión es un caso especial de autorreferencia donde el objeto al que se hace referencia (o se llama) es una función?
skullpatrol
5

La recursión implica acción.

Ejemplos:

  • una función que se llama a sí misma
  • una expresión regular que realiza una coincidencia * o + (es decir, repetitiva)

Técnicamente, la recursividad debe tener un estado de salida, pero no es un requisito.

La autorreferencia implica estructura.

Ex. Un método de instancia que hace referencia al objeto al que está adjunto.

Evan Plaice
fuente
2

La recursión requiere algo para procesar mediante la llamada al mismo proceso (a menudo con diferentes parámetros). Aunque a menudo usa funciones y esas funciones se llaman a sí mismas, técnicamente ingresan a un nuevo paso que parece ser el lugar del que provienen.

Auto-referencia significa que algo se refiere a sí mismo. Las clases pueden ser autorreferenciales mediante el uso this, pero eso no es significativamente recursivo.

Telastyn
fuente
Entonces, ¿la recursión requiere un proceso mediante la llamada al mismo proceso, mientras que la autorreferencia es la "llamada de sí misma"?
skullpatrol
@skullpatrol - no. La autorreferencia no requiere ninguna llamada.
Telastyn
Entonces, ¿la recursión requiere un proceso mediante la llamada al mismo proceso, mientras que la autorreferencia es la "referencia de sí misma"?
skullpatrol