Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porMargarita Solis Carballo Modificado hace 4 años
1
ALGORITMOS Y ESTRUCTURAS DE DATOS. UNIDAD II: ALGORITMOS RECURSIVOS Ing. Diana Gutierrez Solis diana.gutierrez@ies.uni.edu.ni
2
UNIDAD II: ALGORITMOS RECURSIVOS CONTENIDO: 2.1 Bases de la Recursión 2.1.1 Principios de Recursión 2.1.2 Pautas para emplear la recursión 2.1.3 Cómo funciona la recursión 2.1.4 Recursión de extremo final 2.1.5 Cuando no usar la recursión 2.2 Como utilizar la recursión 2.3 Algoritmo de rastreo inverso 2.4 Principio Divide y vencerás 2.5 Prácticas de Laboratorio 2.5.1 Función de Ackermann 2.5.2 Torre de Hanoi 2.5.3 Las ocho reinas
3
Una función de Ackermann es una función matemática recursiva encontrada en 1926 por Wilhelm Ackermann. Tiene un crecimiento extremadamente rápido, lo que es de interés para la ciencia computacional teórica y la teoría de la computabilidad.función matemáticarecursivaWilhelm Ackermannciencia computacional teóricateoría de la computabilidad Hoy en día hay una serie de funciones que son llamadas funciones de Ackermann. Todas ellas tienen una forma similar a la ley original la función de Ackermann y también tienen un comportamiento de crecimiento similar. Esta función toma dos números naturales como argumentos y devuelve un único número natural. Como norma general se define como sigue:números naturales 2.5.1 FUNCION DE ACKERMAN
4
FACTORIAL DE UN NUMERO ENTERO POSITIVO
5
A finales de la década de 1920, los matemáticos Gabriel Sudan y Wilhelm Ackermann, estudiantes de David Hilbert, estaban estudiando los fundamentos de la computación. Tanto a Sudán como a Ackermann se les atribuye el descubrimiento de funciones computables totales (denominadas simplemente "recursivas" en algunas referencias) que no son recursivas primitivas. Sudán publicó la función de Sudán, menos conocida, y poco después y de forma independiente, en 1928, Ackermann publicó su función (la letra griega phi ). La función de tres argumentos de Ackermann “se define de tal manera que para p = 0, 1, 2, reproduce las operaciones básicas de suma, multiplicación y exponenciación como θ. θ (m, n, p) HISTORIA
6
θ (m, n, p) θ (m, n, 0) = m+n θ (m, n, 1) = m*n θ (m, n, 2) = m n y para p > 2 extiende estas operaciones básicas de una manera que se puede comparar con las hiperoperaciones :hiperoperaciones θ (m, n, 3) = m 2 (n+1) θ (m, n, p) = m p-1 (n+1) (p ≥ 4)
7
Aparte de su papel histórico como función recursiva total computable pero no primitiva, se considera que la función original de Ackermann extiende las operaciones aritméticas básicas más allá de la exponenciación, aunque no tan perfectamente como las variantes de la función de Ackermann que están diseñadas específicamente para ese propósito, como la secuencia de hiperoperación de Goodstein ).lahiperoperación de Goodstein En Sobre el infinito, David Hilbert se planteó la hipótesis de que la función de Ackermann no era recursiva primitiva, pero fue Ackermann, el secretario personal y ex alumno de Hilbert, quien de hecho demostró la hipótesis en su artículo Sobre la construcción de los números reales de Hilbert. HISTORIA
8
La función original de tres argumentos de Ackermann se define recursivamente de la siguiente manera para los enteros no negativos m, n y p : θ (m, n, p) θ (m, n, 0) = m+n θ (m, 0, 1) = 0 θ (m, 0, 2) = 1 θ (m, 0, p) = m para p>2 θ (m, n, p) = θ (m, θ (m, n-1), p-1) para n>0 y p>0 FUNCION DE ACKERMAN
9
De las diferentes versiones de dos argumentos, el desarrollado por Péter y Robinson (llamado "la" función de Ackermann por algunos autores) se define para los números enteros no negativos m y n de la siguiente forma: FUNCION DE ACKERMAN La recursividad en la funcion de Ackermann, está limitada porque en cada ejecución recursiva m disminuye o m permanece igual y n disminuye. Cada vez que n llega a cero, m disminuye, por lo que m eventualmente también llega a cero. (Expresado más técnicamente, en cada caso el par (m, n ) disminuye en el orden lexicográfico en pares,
10
lo cual es un buen orden, al igual que el orden de los enteros individuales no negativos; esto significa que uno no puede bajar en el orden infinitamente muchas veces seguidas). Sin embargo, cuando m disminuye, no hay límite superior en cuanto a lo que n puede aumentar, y a menudo aumentará mucho. A (m, n) La función Péter-Ackermann también se puede expresar en términos de varias otras versiones de la función Ackermann: La versión indexada de la notación de flecha hacia arriba de Knuth (extendida a índices enteros ≥ 2): A (m, n) = 2 m-2 (n + 3) - 3. La parte de la definición A ( m, 0) = A ( m - 1, 1) corresponde a 2 m+1 3 = 2 m 4. Notación de flecha encadenada de Conway : A (m, n) = (2 →(n + 3) → (m-2)) - 3 para m ≥ 3 por lo tanto 2 → n → m = A (m + 2, n - 3) +3 para n > 2 ( n = 1 y n = 2 corresponderían con A ( m, −2) = −1 y A ( m, −1) = 1, que lógicamente podrían sumarse). FUNCION DE ACKERMAN
11
Usando la notación de hiperoperaciones, A ( m, n ) se puede expresar como 2 [ m ] ( n - 3) - 3, para m > 1. Para valores pequeños de m como 1, 2 o 3, la función de Ackermann crece relativamente lentamente con respecto a n (como máximo exponencialmente ). Para m ≥ 4, sin embargo, crece mucho más rápidamente; incluso A (4, 2) es aproximadamente 2 × 10 19 728, y la expansión decimal de A (4, 3) es muy grande según cualquier medida típica. Un aspecto interesante de la función de Ackermann es que las únicas operaciones aritméticas que utiliza son la suma y la resta de 1. Sus propiedades provienen únicamente del poder de la recursividad ilimitada. Esto también implica que su tiempo de ejecución es al menos proporcional a su producción, por lo que también es extremadamente grande. En realidad, en la mayoría de los casos, el tiempo de ejecución es mucho mayor que la salida. FUNCION DE ACKERMAN
12
Una versión de un solo argumento f ( n ) = A ( n, n ) que aumenta m y n al mismo tiempo eclipsa todas las funciones recursivas primitivas, incluidas funciones de crecimiento muy rápido como la función exponencial, la función factorial, y funciones superfactoriales, e incluso funciones definidas usando la notación de flecha hacia arriba de Knuth (excepto cuando se usa la flecha hacia arriba indexada). Puede verse que f ( n ) es aproximadamente comparable a f ω ( n ) en la jerarquía de rápido crecimiento. Este crecimiento extremo se puede aprovechar para mostrar que f, que obviamente es computable en una máquina con memoria infinita como una máquina de Turing y por lo tanto es una función computable, crece más rápido que cualquier función recursiva primitiva y, por lo tanto, no es recursiva primitiva. FUNCION DE ACKERMAN
13
Ejemplos: FUNCION DE ACKERMAN Para ver cómo la función de Ackermann crece tan rápidamente, es útil expandir algunas expresiones simples usando las reglas de la definición original. Por ejemplo, se puede evaluar completamente de la siguiente manera: A (1,2) A (1,2) = A (0, A (1,1)) = A (0, A (0, A (1,0))) = A (0, A (0, A (0,1))) = A (0, A (0,2)) = A (0,3) = 4.
14
Para demostrar cómo el cálculo de cómo da como resultado muchos pasos y un gran número: A (4,3) FUNCION DE ACKERMAN A (4,3) = A (3, A (4,2)) = A (3, A (3, A (4,1))) = A (3, A (3, A (3, A (4,0)))) = A (3, A (3, A (3, A (3,1)))) = A (3, A (3, A (3, A (2, A(3,0))))) = A (3, A (3, A (3, A (2, A(2,1))))) = A (3, A (3, A (3, A (2, A(1, A(2,0)))))) = A (3, A (3, A (3, A (2, A(1, A(1,1)))))) = A (3, A (3, A (3, A (2, A(1, A(0,A(1,0))))))) = A (3, A (3, A (3, A (2, A(1, A(0,A(0,1))))))) = A (3, A (3, A (3, A (2, A(1, A(0, 2)))))) = A (3, A (3, A (3, A (2, A(1,3))))) = A (3, A (3, A (3, A (2, A(0,A(1,2)))))) = A (3, A (3, A (3, A (2, A(0,A(0,A(1,1))))))) = A (3, A (3, A (3, A (2, A(0,A(0,A(0,A(1,0)))))))) = A (3, A (3, A (3, A (2, A(0,A(0,A(0,A(0,1)))))))) = A (3, A (3, A (3, A (2, A(0,A(0,A(0,2))))))) = A (3, A (3, A (3, A (2, A(0,A(0,3)))))) = A (3, A (3, A (3, A (2, A(0,4))))) = A (3, A (3, A (3, A (2,5)))) = …. = A (3, A (3, A (3,13)))) =…. = A (3, A (3,65533)) =…. = A (3, 2 65536 - 3) =…. =
15
La funcion de Ackerman, es un tipo de recursividad anidada: FUNCION DE ACKERMAN Ack(m-1, 1)si m > 0 y n = 0 Ack(m, n) n + 1si m = 0 Ack(m-1, Ack(m, n-1))si m > 0 y n > 0 Argumento que es una llamada recursiva
16
FUNCION DE ACKERMAN Números de Ackermann... int ackermann(int m, int n) { int resultado; int resultado; if (m == 0) { if (m == 0) { resultado = n + 1; resultado = n + 1; } else if (n == 0) { else if (n == 0) { resultado = ackermann(m - 1, 1); resultado = ackermann(m - 1, 1); } else { else { resultado = ackermann(m - 1, ackermann(m, n - 1)); resultado = ackermann(m - 1, ackermann(m, n - 1)); } return resultado; return resultado;} Ack(m-1, 1)si m > 0 y n = 0 Ack(m, n) n + 1si m = 0 Ack(m-1, Ack(m, n-1))si m > 0 y n > 0
17
FUNCION DE ACKERMAN
19
EFICIENCIA DE FUNCION DE ACKERMAN La función Pot(a,b) es la que calcula la potencia b-ésima de un número a dado, esto es, ab, y la función Log(a,b) la que calcula el logaritmo en base a de b. La complejidad temporal del algoritmo viene determinada en primer lugar por el valor del parámetro m ya que ha de actualizarse m veces el vector A, y además por el tamaño de este vector, resultando en un orden O(m·MaxIndice) debido a los dos bucles anidados del programa. Este procedimiento es, sin embargo, muy “ingenuo”. Y decimos esto porque, aunque perfectamente correcto desde un punto de vista teórico, su utilidad práctica es más bien poca. Al tener que manejar números tan grandes, que a su vez deben
20
FUNCION DE ACKERMAN Números de Ackermann... int ackermann(int m, int n) { int resultado; int resultado; if (m == 0) { if (m == 0) { resultado = n + 1; resultado = n + 1; } else if (n == 0) { else if (n == 0) { resultado = ackermann(m - 1, 1); resultado = ackermann(m - 1, 1); } else { else { resultado = ackermann(m - 1, ackermann(m, n - 1)); resultado = ackermann(m - 1, ackermann(m, n - 1)); } return resultado; return resultado;} Ack(m-1, 1)si m > 0 y n = 0 Ack(m, n) n + 1si m = 0 Ack(m-1, Ack(m, n-1))si m > 0 y n > 0
21
FUNCION DE ACKERMAN Números de Ackermann... int ackermann(int m, int n) { int resultado; int resultado; if (m == 0) { if (m == 0) { resultado = n + 1; resultado = n + 1; } else if (n == 0) { else if (n == 0) { resultado = ackermann(m - 1, 1); resultado = ackermann(m - 1, 1); } else { else { resultado = ackermann(m - 1, ackermann(m, n - 1)); resultado = ackermann(m - 1, ackermann(m, n - 1)); } return resultado; return resultado;} Ack(m-1, 1)si m > 0 y n = 0 Ack(m, n) n + 1si m = 0 Ack(m-1, Ack(m, n-1))si m > 0 y n > 0
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.