¿Por qué me cuesta entender la recursividad?

La recursión definitivamente no es algo fácil de entender al principio. La mayoría de la gente lucha con eso. La mejor manera de tener una idea real de cómo funciona sería mirar algunos algoritmos recursivos y rastrearlos a mano en papel para algunas entradas.

El trazado realmente ayuda. Por ejemplo, podrías tomar Merge Sort. Intente rastrear la ejecución del programa para varios arreglos. Una vez que te sientas cómodo, prueba algo como Clasificación rápida. Si tiene ganas de probar un poco más, la selección rápida debería ser otro buen ejemplo. Incluso podría intentar escribir un algoritmo de multiplicación recursiva simple.

Algo como:

int multiply (int N, int m) {
/ * Multiplicar N por m * /
if (m == 1) devuelve N;
más{
retorno (N + multiplicar (N, m-1));
}
}

La mejor manera de familiarizarse con el diseño de algoritmos recursivos sería analizar los problemas que se encuentran bajo el paradigma “Divide y vencerás”. Básicamente, problemas en los que puede dividir el problema en múltiples subproblemas, resolver cada subproblema (posiblemente de manera recursiva) y luego combinar los resultados de cada subproblema para obtener el resultado final.

Estos enlaces deberían ser útiles:

Este video del profesor Brailsford debería ser útil:

Divide y vencerás | Set 1 (Introducción) – GeeksforGeeks: Introducción a dividir y conquistar

https://www.coursera.org/learn/a…: Un buen curso que introduce varias técnicas de diseño de algoritmos. La sección Divide y vencerás te ayudará con la recursividad.

https://www.coursera.org/course/…: Otro buen curso para ayudarte a entender

https://www.coursera.org/special…

¡Buena suerte! La recursión se convierte en un activo muy poderoso una vez que la dominas. No te preocupes si luchas con eso. Todos lo hacen.

EDITAR 1:

Una respuesta para una pregunta similar del único Thomas Cormen .

¿Cuál es una buena manera de entrenarse para sentirse cómodo pensando recursivamente sobre un problema? Muchas técnicas de diseño de algoritmos, como la programación dinámica, se basan en la recursividad. Por lo tanto, quiero ser bueno para pensar recursivamente.

Bueno, mi amigo, ¡no es tan difícil!

Es muy interesante, solo sigue el siguiente ejemplo:

Un niño no podía dormir, entonces su madre le contó una historia sobre una pequeña rana, que no podía dormir,

entonces la madre de la rana le contó una historia sobre un osito que no podía dormir,

así que la madre del oso le contó una historia sobre una pequeña comadreja … que se durmió.

… y el osito se durmió; … y la pequeña rana se durmió; … y el niño se durmió.

Muy fácil de hacer … ¿verdad?

Ahora, esto es algo que debo responder para ir en términos de código:

La recursión es un método para resolver problemas basado en la mentalidad de dividir y conquistar. La idea básica es tomar el problema original y dividirlo en instancias más pequeñas (más fáciles de resolver) de sí mismo, resolver esas instancias más pequeñas (generalmente usando el mismo algoritmo nuevamente) y luego vuelva a montarlos en la solución final.

El ejemplo canónico es una rutina para generar el factorial de n. El factorial de n se calcula multiplicando todos los números entre 1 y n. Una solución iterativa en C # se ve así:

Hecho público int (int n)

{

int hecho = 1;

para (int i = 2; i <= n; i ++)

{

hecho = hecho * i;

}

hecho de retorno;

}

No hay nada sorprendente en la solución iterativa y debería tener sentido para cualquier persona familiarizada con C #.

Creo que lo tienes ahora, querida 🙂

La recursión significa literalmente “Re-ocurrencia”. Un programa o un código que se repite un cierto número de veces (hasta que se produce un fallo de condición) se denomina función recursiva.

La recursión generalmente se realiza con la declaración “return ()”. Lo que significa que el programa devuelve algún valor hasta que su condición se convierta en falla.

Considera lo siguiente

int main ()
{
int n, f;
printf (“Ingrese un número:”);
scanf (“% d”, & n);
f = hecho (n);
printf (“Factorial es:% d”, f);
devuelve 0;
}
hecho de hecho (int n)
{
si (n == 1)
retorno 1;
más
return (n * hecho (n-1)); \\ stmt recursivo
}

Si el valor de n es 5,
La función recursiva significaría …

  • n-1 * (respuesta de (n-1) -1) \\ valor de n is4
  • n-2 * (respuesta de (n-2) -1) \\ ..n es 3
  • .
  • .
  • .
  • n-4 * … \\ n es 1, por lo que ahora se ejecuta la parte verdadera de if..else stmt.
  • Entonces la respuesta lógica será

  • 5 * 4 * 3 * 2 = 120

Creo que necesitas cambiar la forma en que ves la recursividad. Lo que sucede cuando miramos la recursividad normalmente, creemos que la función se está ingresando a sí misma, así que confunda cuáles son los valores de los argumentos, las variables, etc.

En su lugar, debe considerar la función como una función diferente. Aunque es la misma función, se ejecuta una nueva copia del bloque de código. Debe buscar la misma función pero como un nuevo bloque de código con todo lo nuevo cuando se llama de forma recursiva.

También con pocos intentos lo conseguimos. Es difícil entenderlo de inmediato. La recursión lleva tiempo para ser de su propiedad. Espero que encuentres algo útil.

More Interesting

Una computadora pequeña tiene 4 marcos de página. Un proceso hace la siguiente lista de referencias de página; 1,2,3,4,1,5,2,3,1,2. ¿Cuántas fallas de página ocurren usando los siguientes algoritmos de reemplazo de página?

¿Qué es el código binario?

Cómo llegar a la lógica para construir un método de impresión inversa que imprima los nodos en una lista vinculada usando un enfoque recursivo usando Java

¿Qué estructura de datos debo usar para completar esta tarea?

¿Cómo se creó el 'algoritmo' de la evolución biológica?

¿Cuál es el algoritmo más eficiente y efectivo para la detección de anomalías / valores atípicos cuando los datos tienen un pico / valle estacional?

¿Qué algoritmos de programación utiliza cada sistema operativo común?

¿Cuál es el mejor algoritmo de cifrado real utilizado en el almacenamiento de datos basado en hardware?

¿Cuáles son los algoritmos para determinar si un punto está dentro de una forma cerrada arbitraria o no?

¿Podría haber un límite superior en la 'inteligencia' de una IA?

¿Qué estructura de datos usaría para diseñar un programa de planificación de producción?

¿Cuál es el libro perfecto sobre CPP y algoritmos?

Encontré un problema algorítmico y no sé cómo resolverlo. ¿Alguien me puede ayudar?

¿Puedo encontrar el camino hamiltoniano más corto en un gráfico completo ponderado no dirigido en tiempo polinómico (donde todos los pesos no son negativos)?

¿Cómo funciona este algoritmo para encontrar el máximo común divisor (MCD)?