Recursión en Python
En programación, existe un concepto llamado recursión - cuando una función se llama a sí misma.
Ejemplo . Recursión simple con contador
Mostremos números del 1 al 10
usando recursión:
i = 1
def func():
global i
print(i)
i += 1
if i <= 10:
func() # aquí la función se llama a sí misma
func()
Analicemos cómo funciona este código.
Tenemos una variable global i
y una función func, dentro de la cual
se muestra en la consola el contenido de la variable
i, y luego se le suma uno.
Si nuestra variable i es menor o
igual a 10, entonces la función se llama
nuevamente. Dado que la variable i -
es global, en cada nueva llamada de la
función, contendrá el valor de la variable
i establecido en la llamada anterior.
Resultará que la función se llamará a sí
misma hasta que i sea
mayor que 10.
Tenga en cuenta que en nuestro caso no se puede ejecutar la función
sin if - si se hace esto,
se producirá una llamada infinita de funciones.
Ejemplo . Recursión para mostrar elementos de listas anidadas
Más a menudo, las recursiones se aplican para recorrer listas de diferentes niveles de anidamiento. Supongamos que tenemos la siguiente lista:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Creemos una función que la recorra.
En ella, primero es necesario establecer una condición
para que el elemento, que es un primitivo,
es decir, simplemente un número extraído de la lista,
se muestre en la consola. Y si el elemento es
un objeto complejo, por ejemplo, una lista anidada, entonces
en este caso que la función se llame a sí
misma, es decir, ocurra una recursión. Para verificar
el tipo de elemento, usemos la función isinstance.
Solo que para nuestro ejemplo, en el primer parámetro de
isinstance escribiremos el, y
el segundo - el tipo list:
def func(lst):
for el in lst:
if isinstance(el, list):
func(el)
else:
print(el)
Al llamar a la función, se mostrará una serie de todos los números de la lista anidada:
func(lst) # mostrará 1, 2, ... 8, 9
Ejemplo . Recursión para operaciones con elementos de listas anidadas
Las recursiones también se pueden aplicar para varias operaciones con elementos de listas anidadas. Supongamos que tenemos la siguiente lista:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Obtengamos la suma de todos sus elementos.
Para ello, declaremos en la función una variable res,
en la que se acumulará la suma de los números.
En la condición, especificaremos que si el elemento
es un objeto complejo, entonces pasa
como parámetro a la función func y se suma
a la suma. Esto significa que el elemento
estará en recursión hasta que se convierta en
un primitivo. Y en ese caso, simplemente
se sumará al valor acumulado en res:
def func(lst):
res = 0
for el in lst:
if isinstance(el, list):
res += func(el)
else:
res += el
return res
Llamemos a la función y mostremos su resultado en la consola:
print(func(lst)) # mostrará 45
Ejemplo . Recursión para acumular en una lista
Usando recursión, se pueden descomponer listas anidadas en una lista unidimensional. Supongamos que tenemos la siguiente lista:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Especifiquemos en la función una lista vacía
res, en la que se acumularán
los elementos de la lista original. Luego iniciemos un
ciclo y establezcamos una condición: si el elemento
es una lista, entonces pasará al método
extend. Este método une
los elementos de una lista al final de una segunda
lista, es decir, los elementos de la lista anidada
pasarán al final de la lista res:
def func(lst):
res = []
for el in lst:
if isinstance(el, list):
res.extend(func(el))
else:
res.append(el)
return res
print(func(lst))
El resultado del código ejecutado:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Tareas prácticas
Muestre todos los elementos numéricos de un diccionario de nivel de anidamiento arbitrario:
{
'a': {
'b': 1,
'c': 2,
'd': {
'e': 3,
'f': 4
}
},
'j': {
'h': 5,
'k': 6,
},
'l': 7
}
Encuentre la suma de los elementos del diccionario de la tarea anterior.
Obtenga una lista de los elementos primitivos del diccionario de la tarea anterior.