Recursividad

34
Funciones recursivas Roberto Moriyón

description

FIIS UNI

Transcript of Recursividad

  • Funciones recursivasRoberto Moriyn

  • Ejemplo: Funcin de AckermanF(i,x) = (i=0) ? x+1 : ((x=0) ? F(i-1,1) :F(i-1,F(i,x-1)))Ejemplos:F(0,x) = x+1F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1) = 2F(1,2) = F(0,F(1,1)) = F(0,2) = 3F(1,x) = F(0,F(1,x-1)) = = F(0,x) = x+1F(2,1) = F(1,F(2,0)) = F(1,F(1,1)) = F(1,2) = 3F(2,x) = F(1,F(2,x-1)) = = F(1,2x-1) = 2x+1

  • Definiciones recursivas primitivasEjemplo con un argumento:F(x+1) = 2*F(x)F(x+1) = g(F(x))F(0) = 1F(0) = hDefinicin general:F(x1+1, x2, , xn) = g(F(x1, x2, , xn), x1, x2, , xn)F(0, x2, , xn)= h(x2, , xn)Ejemplos: La definicin de Ackerman no lo esF(x+1,y)= F(x, y)+2F(0,y)= y+2

  • Funciones recursivas primitivas: Funciones bsicasLas funciones recursivas bsicas numricas son:Sucesor:s(x) = x+1Anulacin:n(x) = (x=0) ? 1 : 0Proyecciones:uin(x1, , xn) = xi

  • Funciones recursivas primitivasSe pueden definir a partir de las bsicas mediante recursin primitiva y composicinEjemplos:F(x) = s(s(x))G(x+1, y)= F(G(x, y))G(0,y)= F(y)

  • ComposicinEn general, si f(x1,,xn), g1(y1,,ym),, gn(y1,,ym) son funciones, diremos que la funcinh(y1,,ym) = f(g1(y1,,ym),,gn(y1,,ym))se obtiene a partir de ellas mediante composicin.En realidad corresponde a la composicin de G con f, donde G es la funcin vectorial con coordenadas g1, , gn.

  • Totalidad y computabilidad de las funciones recursivas primitivasSi f es RP, es totalLa funcin prev: N - { 0 } N definida medianteprev(x+1) = xno es total (y tampoco RP)Las funciones RP son computables, pues tanto f(x)=y como f(x)y se pueden determinar algortmicamente en tiempo finito.

  • EJERCICIOS: Demostrar que las siguientes funciones son RP[RPN1] fk(x) = k[RPN2] suma(x, y)[RPN3] restap(x, y)// Da 0 si y > x[RPN4] producto(x, y)[RPN5] restaabs(x, y)// |x-y|[RPN6] positivo(x)// x > 0 ? 1 : 0[RPN7] max(x, y)[RPN8] min(x, y)[RPN9] factorial(x)[RPN10] potencia(x, y)// xy[RPN11] par(x)// x = 2*(x/2) ? 1 : 0

  • EJERCICIOS: Demostrar que las siguientes funciones son RP[RPN12] cocientedefecto(x, 2)[RPN13] cocientedefectop(x, y)// (x, 0) 0[RPN14] iguales(x, y)[RPN15] menoroigual(x, y)[RPN16] menor(x, y)[RPN17] divisor(x, y)[RPN18] primo(x)[RPN19] restodivision(x, y)[RPN20] primomayor(x)// Primero mayor[RPN21] mcd(x, y)[RPN22] mcm(x, y)

  • Funciones recursivas primitivas sobre cadenas de caracteresLas funciones recursivas bsicas sobre cadenas de caracteres son:Anteposicin: s(x). Ejemplo: sa(abc)=aabcVacuidad:v(x) = (x=) ? : Proyeccionesuin(x1, , xn) = xiEjemplos:f(x) = s(s(x))g(,y) =fab(y) g(sa(x),y) =fab(g(x,y))g(sb(x),y) =fba(g(x,y))

  • Funciones recursivas primitivas sobre cadenas de caracteres, IIUna recursin primitiva sobre cadenas est formada por ||+1 reglas:f(s(w1),x2,,wn) = g(f(w1,w2,,wn),w1,w2,, wn)f(0, w2, , wn) = h(w2, , wn)donde cada g y h son funciones recursivas primitivas.Las funciones recursivas primitivas sobre cadenas tambin son totales y computables

  • Funciones recursivas primitivas sobre cadenas de caracteres, IIILa funcin resto: + * que elimina el primer carcter no es total ni, por lo tanto, recursiva primitiva

  • EJERCICIOS: Demostrar que las siguientes funciones son RP[RPC1] fv(w) = v[RPC2] start(v)// start(ab)=a, start(0) = 0[RPC3] fin(v)// end(ab)=b, end(0)=0[RPC4] cuenta(v)// cuentaa(abbaba)=aaa[RPC5] concatena(v, w)[RPC6] invierte(v)[RPC7] esPalndrome(v)[RPC8] esVaca(v)

  • EJERCICIOS: Demostrar que las siguientes funciones son RP[RPC9] iguales(v, w)[RPC10] contiene(v, w)// contiene(abcba, bcb) = a// contiene(abcba, bab) = 0[RPC11] sustituye(u, v, w)[RPC12] longitud(v)// longitud(abc) = aaa

  • Funciones recursivas primitivas: Suma recursivaSuponemos que f(n) es recursiva primitivag(m) = f(0) + f(1) + + f(m)g(0) = 0g(m+1) = suma(g(m), f(s(m)) = h(g(m),m)dondeh(x,y) = suma(x,f(s(y))es primitiva recursiva, luego g tambin lo es.

  • EjerciciosSuponemos que f(m) es recursiva primitiva. Demostrar que las siguientes funciones tambin lo son: [RPA1], [RPA2], [RPA3], [RPA4]g(m,x) = min(f(0), f(1), , f(m))g(m,x) = f(f(f(f(x))))// m concatenaciones de fg(x) = 1 si mx, f(m)=0, y g(x) = 0 en caso contrariog(x) = 1 si mx, f(m)=0, y g(x) = 0 en caso contrario

  • Totalidad y computabilidad de la funcin de AckermanF(i,x) = (i=0) ? x+1 : ((x=0) ? F(i-1,1) :F(i-1,F(i,x-1)))Es totalEs computableSin embargo, no es recursiva primitiva:Fj(x) = F(j, x) = Fj-1(Fj-1((Fj-1(0)))Fx(x) crece ms rpido que cualquier funcin de la sucesin f0(x)=x+1, fj+1(x)=fj(fj((fj(0)))Las funciones R.P. crecen como alguna de las funciones anteriores

  • Formas de definicin de las funciones recursivasDefinicin usual: Aplicar la definicin repetidamente, utilizando una pila de clculos parciales, hasta que se llegue al resultadoEjemplo: Para la funcin de Ackerman, F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1) = 2

  • Formas de definicin de las funciones recursivas, IIForma rigurosa (aunque terica):Definir F sobre un primer dominio, D0, donde se puede calcular directamenteEjemplo: Para la funcin de Ackerman, D0={(i,x)|i=0}, en cuyo caso f0(i,x)=x+1Definir F sobre un dominio Dj+1 si su clculo se puede reducir al de F sobre DjEjemplo: D1=D0{(i,x) | x=0}; f1(i,x) = D2=D1{(1,1)}; f2(i,x) = , etc

  • Formas de definicin de las funciones recursivas, IIIInterpretacin de la forma anterior: punto fijo de un operadorP(f)(x) = (i=0) ? x+1 : ((x=0) ? f(i-1,1) :f(i-1,f(i,x-1)))P(f0) = f1P(f1) = f2F es un punto fijo de P: P(F) = F

  • EJERCICIOS[REC 1] Calcular el dominio y los valores de las imgenes de las funciones f y g definidas mediantef(x,y) = 2.f(y, 2.x)g(x) = (x < 5) ? f(x, x) : ((x = 5) ? 1 : x*g(x-1))[REC 2] Calcular el dominio y los valores de las imgenes de la funcin h definida medianteh(x, y) = (x = 0) ? 1 : h(x 1, h(|x y|, y))

  • Funciones recursivas: MinimizacinSi f(x,y) es una funcin recursiva, entoncesg(x) = min { y | f(x,y) 0 }define otra funcin recursivaDemostracin: Definimosgaux(x, z) = min { y | f(x, z+y) 0 }entoncesgaux(x, z) = (f(x, z) 0) ? 0 : 1 + gaux(x, z+1)g(x) = gaux(x,0)

  • EJERCICIOSSuponiendo que la funcin f(x,y) sea recursiva, demostrar que tambin lo es la funcin g(x) cuyo valor es la suma f(x,0) + f(x,1) + + f(x,n) donde n se elije de manera que los sumandos sean diferentes de 0 y f(x,n+1)=0.

  • Ejemplo de funciones recursivas: Mquinas de TuringDada una mquina de Turing determinista M, la funcin transita(x, y), donde x e y son estados instantneos de ejecucin de M, que vale a si la mquina M lleva la cinta del estado x al y y en caso contrario, es recursiva (pero no recursiva primitiva)

  • Ejemplo de funciones recursivas: Mquinas de Turing, IIDemostracin:transita(x, y) = esEstado(x) & esEstado(y) && ((x=y) ? a : transita(aplicaRegla(x), y))La funcin aplicaRegla(x) devuelve el resultado de aplicar una regla de transicin de M a partir del estado de ejecucin x; si no se puede, devuelve x.EJERCICIO: [MT REC] Demostrar que las funciones esEstado(x) y aplicaRegla(x) son recursivas primitivas.

  • Ejemplo de funciones recursivas: Mquinas de Turing, IIIDada una mquina de Turing determinista M, la funcin ejecuta(x, y), donde x, y*, que devuelve el estado instantneo de ejecucin de M a partir de y despus de |x| transiciones, es recursiva primitiva.Demostracin:ejecuta(, y) = Sq(y)ejecuta(S(x), y) =aplicaRegla(ejecuta(x, y))

  • Ejemplo de funciones recursivas: Mquinas de Turing, IVDada una mquina de Turing determinista M, la funcin produce(x), que a cada cadena x le hace corresponder el contenido de la cinta cuando M se para a partir de x es recursiva (pero puede no ser recursiva primitiva)Demostracin:produce(x) =quitaEstado(ejecuta(x,miny(para(ejecuta(x, y)))))Observacin: miny se puede definir en este caso de forma anloga a como se hace con nmeros.

  • Forma normal de funciones recursivasTodas las funciones recursivas se pueden escribir en la formaf(x) = p(miny(q(x, y)))donde p y q son funciones recursivas primitivas.Las funciones p y q se pueden elegir de manera que p simplemente elimine el contenido de la cinta previo a un separador.

  • Forma normal: programasLa construccin anterior tambin se puede hacer con programas en lugar de mquinas de Turing: a partir de cualquier programa podemos construir otro equivalente que incorpora un contador y emula al primero paso a paso y cuando el inicial se para sigue ejecutndose sin hacer nada y guardando en una variable booleana fin la informacin de que el programa emulado ha terminado.

  • Forma normal: programas, IIEl clculo del programa inicial se puede realizar buscando el valor mnimo del contador del programa emulador para el cual la variable fin es cierto, y devolviendo la variable que contiene el valor del programa emulado.

  • Ejemplo de funciones recursivas: Mquinas de Turing, VSi una mquina de Turing tiene una definicin mediante submquinas que es recursiva, la funcin que define sobre cadenas de caracteres es recursiva.Como consecuencia de lo anterior, las mquinas de Turing definidas recursivamente mediante submquinas no proporcionan un mecanismo de computacin ms potente que las mquinas de Turing simples.

  • Ejemplo de funciones recursivas: Mquinas de Turing, VILa demostracin de la afirmacin anterior se basa en la funcin FM(q, u, x, v), que da el estado final de ejecucin (q, u, x, v) calculado por la mquina a partir del estado q con la palabra uxv sobre la cinta, apuntando a la x. Su definicin esFM(q, u, x, v) = FM(q, 234(FN(q, u, x, v)))donde N es la submquina correspondiente a la transicin. Esto da lugar a una definicin recursiva de las funciones FM.Si la submquina es indeterminista, se demuestra de manera anloga utilizando conjuntos de estados en lugar de estados.

  • Qu funciones son recursivas?Todas las calculablesEs consecuencia de lo anteriorTambin es consecuencia de la construccin de una mquina universal que emula mquinas de Turing con submquinas recursivas

  • Qu funciones son recursivas?, IILas que se obtienen a partir de las recursivas primitivas bsicas mediante composicin, recursin primitiva y minimizacinEs consecuencia de lo anterior

    **********************************