¿Qué es una llamada recursiva?

En programación, una llamada recursiva es un comando dentro de una subrutina o función que le dice al programa que ejecute la misma subrutina nuevamente. La ejecución repetida puede ser el resultado directo de la función, o puede activarse una segunda función que, a su vez, remite a la primera función. Una llamada recursiva tiene algunas similitudes con el temido bucle infinito, pero la subrutina siempre tiene una declaración condicional que le dice al programa cuándo dejar de repetir la recursividad.

El concepto de recursividad quizás se ilustra mejor mediante el uso de un ejemplo. Suponga que un techador está colocando tejas nuevas en una casa. Para comenzar, debe llevar un paquete de tejas al techo. Una vez que haya clavado el primer paquete en su lugar, debe bajar la escalera, recuperar otro paquete y clavarlo en su lugar. El proceso continúa como una serie de «ir, buscar, regresar» hasta que se haya aplicado la última teja. En ese momento, el techador puede pasar al siguiente trabajo o irse a casa.

Aunque el ejemplo es una simplificación excesiva, contiene todos los elementos de una llamada recursiva. Hay un punto de partida, el techador debe recuperar lo que necesita, volver al principio y, cuando se cumpla la condición final, detenerse. Esto es básicamente lo que hace el programa; comienza, implementa una acción, regresa a sí mismo y termina cuando ocurre la condición final.

La condición final se conoce como caso base. Es esencial para todas las llamadas recursivas; sin él, la función continuaría repitiéndose. En el mejor de los casos, esto da como resultado el agotamiento de los recursos de memoria del sistema. Normalmente, la sobrecarga bloqueará el programa en algún momento, pero cuando se descubra el problema, es posible que se hayan producido daños importantes.

Los programadores experimentados pueden reconocer la similitud entre una llamada recursiva y un bucle «for» o «while». Si, por ejemplo, el objetivo es encontrar el recuento total de inventario de todas las existencias con números de pieza superiores a 999, un bucle «for» le indica al programa que ubique todas las instancias calificadas y un bucle «while» le indica al programa que ejecute el bucle. sólo mientras la condición indicada sea válida. Se podría decir que una llamada recursiva combina algunas de las características de estos bucles con una instrucción «if-then-else»; si esta condición es verdadera, haga esto, o haga algo diferente si la condición es falsa. Sin embargo, la recursividad generalmente permite un código más compacto y permite que el problema se pase a la función más cercana al punto en que se necesita.