¿Cómo se debe describir y hablar sobre la recursividad cuando se hace pizarra o se programa un par?

La mejor manera de hablar sobre la recursividad es a un alto nivel: descomponerlo en casos básicos y casos recursivos. (Casualmente, esta es también la mejor manera de pensar acerca de la recursividad). Esta es la misma estructura que la prueba por inducción, que es cómo demostraría que su función hace lo correcto y termina.

Digamos que está escribiendo una función recursiva simple que calcula la profundidad de un árbol:

profundidad (Hoja _) = 1
profundidad (nodos secundarios) = 1 + máximo (profundidad de mapa secundarios)

En lugar de pasar por este árbol paso a paso, hable sobre las dos posibilidades:

  • si tenemos un nodo hoja, su profundidad es 1 por definición
  • la profundidad de un nodo es 1 + la profundidad de su hijo más profundo

También tenga en cuenta cómo la recursión sigue naturalmente la forma del árbol. ¡Tiene sentido que una función que analiza un árbol refleje la forma de ese árbol en su lógica!

Esta descripción captura exactamente la lógica en cuestión, sin confundirse con toda la recursión que ocurre. Seguir esta simple función recursiva paso a paso es confuso porque se ramifica y recurre varias veces en cada nodo. Tomaría un cálculo en forma de árbol y lo linealizaría de alguna manera, lo cual es innecesariamente complejo y oscurece la naturaleza de la función.

Si realmente tiene que recorrer toda la función, tal vez su entrevistador lo pregunte explícitamente, puede hablar sobre “llamadas recursivas” en lugar de “iteraciones”. Pero no lo recomiendo la mayor parte del tiempo: tratar de pensar en definiciones recursivas de la forma en que piensas en los bucles simplemente no escala . Puede funcionar para las funciones recursivas más triviales, pero se desmorona totalmente en una lógica más compleja, recursividad mutua, etc.

Por supuesto, si realmente quiere impresionar al entrevistador, hable sobre la diferencia entre la recursividad regular y la recursividad de cola.

En cuanto a cómo describirlo:

  1. Asegúrese de que USTED lo entienda (lea, mire presentaciones de slideshare, escriba algún código).
  2. Explíquele a su gato (como en “Antes de comenzar cualquier proyecto de programación, intente explicárselo a su gato”. – Stuart Fleming)

Entonces estás listo.

Cualquier algoritmo recursivo tiene 2 componentes:

  • Un punto de retorno. También se llama una línea base.
  • Una forma de reducir (o aumentar) el conjunto de datos hacia el punto de retorno (línea base).

¡Tomemos la N! problema para un ejemplo:

  • El punto de retorno es 0, porque 0! = 1
  • La forma de hacer que N funcione hacia 0 es N = N -1

La recursión es fácil. En muchos casos, es más fácil que usar el bucle. Pero la eficiencia de la recursividad siempre es menor que el bucle.

Pero en algunos lenguajes funcionales como Erlang y Elixir, no hay bucle, por lo que todo lo que tienes es recurrencia.

Dibuja una pila. Cada vez que llame a la función, agregue a la pila y registre el estado del programa / algoritmo. En la pizarra, puede ver cuántas veces lo ha llamado hasta que su programa cumple con el caso base, en ese estado comienza a retroceder. Toma esto por ejemplo:

Eche un vistazo a esto también si aún desea más ejemplos: COMP1006 / 1406 Notas 5 – Recursión

Más o menos de la misma manera. Un programa recursivo tiene (es mejor que tenga, o tendrá que reiniciar, reiniciar o recuperar el control de alguna otra manera) una condición de salida, por lo que recurre hasta … (se alcanza la condición de salida), luego retrocede, una recursión en una vez, haga el cálculo, luego retroceda un paso más. Cuando esté en el primer paso, la copia de seguridad vuelve al flujo del programa que se denomina rutina recursiva.

Bueno, si estás conmigo, dado que no soy particularmente bueno con la recursividad, podrías decir

¿Te importa si tomo las llaves un poco? Tengo esta idea recursiva que creo que será un as. ¡Será más fácil explicarlo una vez que lo haya hecho!

Traeré los tés. Podemos señalar y hablar más tarde.