Casi todos los artículos que puedo encontrar sobre la recursividad incluyen ejemplos de números factoriales o de Fibonacci, que son:
- Matemáticas
- Inútil en la vida real
¿Hay algunos ejemplos interesantes de códigos no matemáticos para enseñar la recursividad?
Estoy pensando en algoritmos de divide y vencerás, pero generalmente involucran estructuras de datos complejas.
Respuestas:
Las estructuras de directorio / archivo son el mejor ejemplo de uso para la recursividad, porque todos las entienden antes de comenzar, pero cualquier cosa que involucre estructuras en forma de árbol servirá.
fuente
Busque cosas que involucren estructuras de árboles. Un árbol es relativamente fácil de entender, y la belleza de una solución recursiva se hace evidente mucho antes que con estructuras de datos lineales como las listas.
Cosas para pensar:
Todos estos están relacionados con escenarios reales del mundo real, y todos pueden usarse en aplicaciones de importancia real.
fuente
https://stackoverflow.com/questions/105838/real-world-examples-of-recursion
https://stackoverflow.com/questions/2085834/how-did-you-practically-use-recursion
https://stackoverflow.com/questions/4945128/what-is-a-good-example-of-recursion-other-than-generating-a-fibonacci-sequence
https://stackoverflow.com/questions/126756/examples-of-recursive-functions
fuente
Aquí hay algunos problemas más prácticos que me vienen a la mente:
fuente
QuickSort sería el primero que salta a la mente. La búsqueda binaria también es un problema recursivo. Más allá de eso, hay toda una serie de problemas por los que las soluciones se caen casi gratis cuando comienzas a trabajar con la recursividad.
fuente
Ordenar, definido recursivamente en Python.
Fusionar, definido de forma recursiva.
Búsqueda lineal, definida recursivamente.
Búsqueda binaria, definida recursivamente.
fuente
En cierto sentido, la recursión se trata de dividir y conquistar soluciones, es decir, dividir el espacio del problema en uno más pequeño para ayudar a encontrar la solución para un problema simple, y luego volver a reconstruir el problema original para componer la respuesta correcta.
Algunos ejemplos que no involucran matemáticas para enseñar la recursividad (al menos esos problemas que recuerdo de mis años universitarios):
Estos son ejemplos del uso de Backtracking para resolver el problema.
Otros problemas son los clásicos del dominio de Inteligencia Artificial: uso de la búsqueda en profundidad, búsqueda de caminos, planificación.
Todos esos problemas involucran algún tipo de estructura de datos "compleja", pero si no desea enseñarla con matemáticas (números), entonces sus opciones pueden ser más limitadas. Es posible que desee comenzar a enseñar con una estructura de datos básica, como una Lista vinculada. Por ejemplo representando los números naturales usando una Lista:
0 = lista vacía 1 = lista con un nodo. 2 = lista con 2 nodos. ...
luego defina la suma de dos números en términos de esta estructura de datos como esta: Vacío + N = N Nodo (X) + N = Nodo (X + N)
fuente
Towers of Hanoi es bueno para ayudar a aprender la recursividad.
Hay muchas soluciones en la web en muchos idiomas diferentes.
fuente
Un detector de palíndromo:
Comience con una cadena: "ABCDEEDCBA" Si los caracteres iniciales y finales son iguales, luego repita y marque "BCDEEDCB", etc.
fuente
Un algoritmo de búsqueda binaria suena como lo que quieres.
fuente
En los lenguajes de programación funcionales, cuando no hay funciones de orden superior disponibles, se utiliza la recursión en lugar de los bucles imperativos para evitar el estado mutable.
F # es un lenguaje funcional impuro que permite ambos estilos, así que compararé ambos aquí. La siguiente suma todos los números en una lista.
Bucle imperativo con variable mutable
Bucle recursivo sin estado mutable
Tenga en cuenta que este tipo de agregación se captura en la función de orden superior
List.fold
y podría escribirse como,List.fold (+) 0 xlist
o incluso más, simplemente con la función de convenienciaList.sum
como talList.sum xlist
.fuente
He usado mucho la recursividad en el juego de IA. Escribiendo en C ++, hice uso de una serie de aproximadamente 7 funciones que se llaman entre sí en orden (con la primera función que tiene una opción para omitirlas y llamar a una cadena de 2 funciones más). La función final en cualquiera de las cadenas llamó a la primera función nuevamente hasta que la profundidad restante que quería buscar fue a 0, en cuyo caso la función final llamaría a mi función de evaluación y devolvería el puntaje de la posición.
Las múltiples funciones me permitieron ramificar fácilmente en función de las decisiones del jugador o eventos aleatorios en el juego. Hacía uso de pasar por referencia cada vez que podía, porque estaba pasando estructuras de datos muy grandes, pero debido a cómo estaba estructurado el juego, era muy difícil tener un "movimiento de deshacer" en mi búsqueda, así que Usaría el paso por valor en algunas funciones para mantener mis datos originales sin cambios. Debido a esto, cambiar a un enfoque basado en bucles en lugar de un enfoque recursivo resultó demasiado difícil.
Puede ver un resumen muy básico de este tipo de programa, consulte https://secure.wikimedia.org/wikipedia/en/wiki/Minimax#Pseudocode
fuente
Un buen ejemplo de la vida real en los negocios es algo llamado "Lista de materiales". Estos son los datos que representan todos los componentes que conforman un producto terminado. Por ejemplo, usemos una bicicleta. Una bicicleta tiene manubrios, ruedas, un cuadro, etc. Y cada uno de esos componentes puede tener subcomponentes. por ejemplo, la rueda puede tener radios, un vástago de válvula, etc. Por lo general, estos se representan en una estructura de árbol.
Ahora, para consultar cualquier información agregada sobre la lista de materiales o para cambiar elementos en una lista de materiales, a menudo recurre a la recursividad.
Y una muestra de llamada recursiva ...
Obviamente, la clase BomPart tendría muchos más campos. Es posible que necesite averiguar cuántos componentes plásticos tiene, cuánto trabajo se necesita para construir una pieza completa, etc. Sin embargo, todo esto vuelve a la utilidad de Recursion en una estructura de árbol.
fuente
Las relaciones familiares son buenos ejemplos porque todos las entienden intuitivamente:
fuente
||
elOR
.Una recursividad bastante inútil pero que muestra un buen funcionamiento interno es recursivo
strlen()
:Sin matemáticas: una función muy simple. Por supuesto, no lo implementa de manera recursiva en la vida real, pero es una buena demostración de recursividad.
fuente
Otro problema de recursión del mundo real con el que los estudiantes pueden relacionarse es crear su propio rastreador web que extraiga información de un sitio web y siga todos los enlaces dentro de ese sitio (y todos los enlaces de esos enlaces, etc.).
fuente
Resolví un problema con un patrón de caballero (en un tablero de ajedrez) usando un programa recursivo. Se suponía que debías mover al caballero para que tocara cada cuadro, excepto unos pocos cuadros marcados.
Tu simplemente:
Se pueden trabajar muchos tipos de escenarios de "anticipación" probando las posibilidades futuras en un árbol como este.
fuente