¿Por qué las funciones recursivas son tan difíciles de entender?

Bueno, intente visualizar la solución para agregar dos enteros positivos utilizando la función recursiva realmente costosa add (x, y) (código de estilo Javascript aquí):

función add (v1, v2) {// agregar v1 y v2
if (v2 === 0) {// condición de detención: devuelve v1 ya que v2 no puede reducirse por debajo de 0
volver v1;
}
return add (v1 + 1, v2 – 1); // sigue aumentando v1 con 1, disminuyendo v2 con 1
}

Asi que:
Hasta la condición de detención (en cuyo caso ha determinado el “final” de su problema, v2 === 0), llama a la función original con una modificación de las variables que tiene un resultado final predefinido.
Cuando v2 llegue a 0 (la condición de detención), habrá aumentado v1 con la cantidad necesaria para disminuir v2 a 0 en pasos de 1.

Solo recuerde que siempre debe definir primero su condición de detención.

Debe definir su problema para que se descomponga en problemas más pequeños que sean iguales al gran problema y, por lo tanto, puedan resolverse con la misma solución.

Aquí hay un ejemplo:

qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
where
lesser = [ y | y <- xs, y < p ]
greater = [ y | y <- xs, y >= p ]

Lo que esto significa, línea por línea:

  1. Estamos definiendo una función que toma una lista y devuelve una lista. Los elementos deben admitir la comparación (es decir, ser ordenables)
  2. Ordenar la lista vacía devuelve una lista vacía (este es el caso base).
  3. Para la lista no vacía, coloque el primer elemento (el pivote) en su posición correcta, entre los elementos que son más pequeños que él y los elementos que son más grandes que él. Además, use la misma función para ordenar las sublistas de los elementos cada vez más pequeños (esto se denomina “paso inductivo” en matemáticas o “llamada recursiva” en programación).

More Interesting

¿Qué algoritmos son buenos candidatos para el reconocimiento de sonido? Estoy principalmente interesado en reconocer sonidos en un entorno doméstico, por ejemplo, un temporizador de microondas que suena, un teléfono que suena, un timbre, etc.

¿Le da un algoritmo no recursivo que realiza un trabajo de árbol de orden?

¿Hay algún algoritmo de corrector ortográfico de aprendizaje no supervisado?

¿Cuáles son las principales diferencias, con ejemplos, entre un algoritmo de aprendizaje profundo y un algoritmo de aprendizaje de refuerzo?

¿Cuál es el algoritmo más adecuado para la agrupación en una red social?

¿Qué es el algoritmo de clasificación de Reddit?

¿Por qué CLRS no cubre algoritmos como el punto más cercano iterativo (ICP)?

¿Cuáles son los algoritmos propuestos para la detección de revisiones falsas en el análisis de sentimientos?

Supongamos que eliminamos un borde de un árbol de expansión y luego agregamos un borde diferente para que permanezca conectado. ¿Seguirá siendo un árbol de expansión?

¿Qué es un algoritmo de programación dinámica que podría resolver el problema a continuación?

Ahora que los bitcoins son famosos y caros, ¿cómo reaccionaría el mercado ante un clon de Bitcoin que utiliza un algoritmo, tecnología, etc. idénticos?

¿Qué técnica general siguen los autores al escribir libros técnicos en LaTeX?

¿Cuál es el mejor algoritmo para girar a la izquierda en los semáforos?

¿Cuáles son algunos algoritmos conocidos para encontrar una coincidencia perfecta en un gráfico bipartito?

¿Cuáles son algunos algoritmos geniales que se pueden usar para el reconocimiento de objetos y cómo los usamos?