1. Función recursiva
Las funciones no solo se pueden definir de forma anidada, sino que también se pueden llamar de forma anidada, es decir, en el proceso de llamar a una función, se llama a otra función dentro de la función, y la llamada recursiva de una función se refiere al proceso de llamar a una función y directamente o llamar indirectamente a la función misma
Hay dos tipos de recursividad: llamada directa y llamada indirecta.
1.1 Llamada directa
En el proceso de llamar a f1, se vuelve a llamar a f1, que es llamar directamente a la función f1
def f1():
print('from f1')
f1()
f1()
1.2 Llamadas indirectas
En el proceso de llamar a f1, se vuelve a llamar a f2, y en el proceso de llamar a f2, se vuelve a llamar a f1, que es la función de llamada indirecta f1 misma
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
f1()
1.3 Condiciones de salida recursivas
Si la recursión no establece la condición de salida, entrará en un bucle infinito, lo cual no tiene sentido, ¡ así que debemos establecer la condición de salida!
Por ejemplo: ingresamos un número al azar y queremos generar un número entero entre el número y 10 (excluyendo 10)