función recursiva Day19

función recursiva


Dentro de la función, se puede llamar a otras funciones. Si una función se llama a sí mismo dentro de sí misma, esta función es una función recursiva.

Por ejemplo, se calcula el factorial n! = 1 x 2 x 3 x ... x n, una función fact(n)expresada, se puede ver:

hecho (n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! xn = hecho de (n-1) xn

Por lo tanto, fact(n)se puede expresar como n x fact(n-1), n = 1, sólo requieren un manejo especial.

Así, fact(n)escritura manera recursiva es utilizar:

def fact(n):
    if n==1: return 1 return n * fact(n - 1) 

Lo anterior es una función recursiva. Usted puede tratar de:

>>> fact(1)
1
>>> fact(5) 120 >>> fact(100) 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 

Si calculamos fact(5), podemos ver se calcula la definición de una función de la siguiente manera:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

Ventaja es definir una función recursiva sencilla, lógica clara. En teoría, todas las funciones recursivas pueden escribirse en forma circular, pero no tan buena como la lógica de bucle recursivo es clara.

necesidades función recursiva que deben tomarse para evitar el desbordamiento de pila. En el ordenador, la llamada de función se consigue a través de la pila (Stack) Esta estructura de datos, cada vez que una llamada de función en la pila de un marco de pila se incrementa en uno, cada vez que la función devuelve, la pila se reducirán un marco de pila. A medida que el tamaño de la pila no es ilimitado, por lo que el número de llamadas recursivas también, puede causar un desbordamiento de pila. Usted puede tratar de fact(1000):

>>> fact(1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in fact ... File "<stdin>", line 4, in fact RuntimeError: maximum recursion depth exceeded in comparison 

Recursiva desbordamiento de pila de llamadas se resuelve por la cola-recursividad optimización, la recursión de cola y, de hecho, el efecto del ciclo es el mismo, por lo que el ciclo como una función recursiva de cola especial también es posible.

medios de recursión de cola que, cuando se devuelve la función, las llamadas en sí misma, y, instrucción de retorno no puede contener expresiones. De esta manera, no importa cuántas veces, solamente ocupan un marco de pila, no se produce el compilador o intérprete que puede hacer para optimizar la recursión de cola, la llamada recursiva a sí misma situación de desbordamiento de pila.

La anterior fact(n)función debido a la return n * fact(n - 1)introducción de la expresión de multiplicación, por lo que es no la cola-recursivo. Para cambiar la forma recursiva de cola, se requiere un código de bits de más es principalmente el producto de cada paso debe pasa a una función recursiva:

def fact(n):
    return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product) 

Se puede observar return fact_iter(num - 1, num * product)solamente devuelve una misma función recursiva, num - 1y num * productserá evaluado antes de la llamada de función no afecta a la llamada a la función.

fact(5)Correspondiente fact_iter(5, 1)llamada de la siguiente manera:

===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20) ===> fact_iter(2, 60) ===> fact_iter(1, 120) ===> 120 

Cuando las llamadas recursiva de cola, si se optimiza, la pila no crecerá, y por lo tanto, no importa cuántas veces la llamada no causar un desbordamiento de pila.

Por desgracia, la mayoría de los lenguajes de programación no optimizados para la recursión de cola, intérprete de Python no hizo optimización, por lo que incluso las anteriores fact(n)funciones en una forma recursiva de cola, pueden dar lugar a desbordamiento de pila.

resumen

La ventaja de utilizar la función recursiva es simple y lógica clara, la desventaja es demasiado profundo puede causar un desbordamiento de pila de llamadas.

Para la optimización de recursión de cola impide idioma desbordamiento de pila a través de la recursión de cola. bucle recursivo de cola y, de hecho, son equivalentes, no existe un lenguaje de programación de ciclos de bucle sólo puede lograrse a través de la recursión de cola.

Estándar de Python intérprete no hacer la recursión de cola está optimizado para cualquier problema de desbordamiento de pila función recursiva existe.

Supongo que te gusta

Origin www.cnblogs.com/AaronY/p/12571838.html
Recomendado
Clasificación