Recursión (ciencias de computación)

13
24/9/2015 Recursión (ciencias de computación) - Wikipedia, la enciclopedia libre https://es.wikipedia.org/wiki/Recursi%C3%B3n_(ciencias_de_computaci%C3%B3n) 1/13 Árbol basado en la recursión creado usando el lenguaje de programación Logo. Recursión (ciencias de computación) De Wikipedia, la enciclopedia libre Recursión es, en ciencias de computación, una forma de atajar y solventar problemas. De hecho, recursión es una de las ideas centrales de ciencia de computación. 1 Resolver un problema mediante recursión significa que la solución depende de las soluciones de pequeñas instancias del mismo problema. 2 El poder de la recursión evidentemente se fundamenta en la posibilidad de definir un conjunto infinito de objetos con una declaración finita. Igualmente, un número infinito de operaciones computacionales puede describirse con un programa recursivo finito, incluso en el caso de que este programa no contenga repeticiones explícitas." 3 La mayoría de los lenguajes de programación dan soporte a la recursión permitiendo a una función llamarse a sí misma desde el texto del programa. Los lenguajes imperativos definen las estructuras de loops como while y for que son usadas para realizar tareas repetitivas. Algunos lenguajes de programación funcionales no definen estructuras de loops sino que posibilitan la recursión llamando código de forma repetitiva. La teoría de la computabilidad ha demostrado que estos dos tipos de lenguajes son matemáticamente equivalentes, es decir que pueden resolver los mismos tipos de problemas, aunque los lenguajes funcionales carezcan de las típicas estructuras while y for . Índice 1 Algoritmos recursivos 2 Programación recursiva 2.1 Ejemplos de subrutinas definidas recursivamente (recursión generativa) 2.1.1 Factorial 2.1.2 Fibonacci 2.1.3 Máximo común divisor 2.1.4 Torres de Hanói 2.1.5 Búsqueda binaria 2.2 Estructuras de datos recursivo (recursión estructural) 2.2.1 Listas enlazadas 2.2.2 Árboles binarios 2.3 Recursión frente a iteración 3 Funciones de recursión de cola 4 Orden en el llamamiento de una función 4.1 Función 1 4.2 Función 2 con líneas cambiadas 5 Recursión directa e indirecta 6 Véase también 7 Notas y referencias 8 Enlaces externos

description

Recursión

Transcript of Recursión (ciencias de computación)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 113

Aacuterbol basado en la recursioacuten creadousando el lenguaje de programacioacutenLogo

Recursioacuten (ciencias de computacioacuten)De Wikipedia la enciclopedia libre

Recursioacuten es en ciencias de computacioacuten una forma de atajar y solventar problemas De hecho recursioacutenes una de las ideas centrales de ciencia de computacioacuten1 Resolver un problema mediante recursioacuten significaque la solucioacuten depende de las soluciones de pequentildeas instancias del mismo problema2

El poder de la recursioacuten evidentemente se fundamenta en la posibilidad de definir un conjuntoinfinito de objetos con una declaracioacuten finita Igualmente un nuacutemero infinito de operacionescomputacionales puede describirse con un programa recursivo finito incluso en el caso de queeste programa no contenga repeticiones expliacutecitas3

La mayoriacutea de los lenguajes de programacioacuten dan soporte a la recursioacuten permitiendo a una funcioacuten llamarsea siacute misma desde el texto del programa Los lenguajes imperativos definen las estructuras de loops comowhile y for que son usadas para realizar tareas repetitivas Algunos lenguajes de programacioacuten funcionalesno definen estructuras de loops sino que posibilitan la recursioacuten llamando coacutedigo de forma repetitiva Lateoriacutea de la computabilidad ha demostrado que estos dos tipos de lenguajes son matemaacuteticamenteequivalentes es decir que pueden resolver los mismos tipos de problemas aunque los lenguajes funcionalescarezcan de las tiacutepicas estructuras while y for

Iacutendice1 Algoritmos recursivos2 Programacioacuten recursiva

21 Ejemplos de subrutinas definidas recursivamente(recursioacuten generativa)

211 Factorial212 Fibonacci213 Maacuteximo comuacuten divisor214 Torres de Hanoacutei215 Buacutesqueda binaria

22 Estructuras de datos recursivo (recursioacutenestructural)

221 Listas enlazadas222 Aacuterboles binarios

23 Recursioacuten frente a iteracioacuten3 Funciones de recursioacuten de cola4 Orden en el llamamiento de una funcioacuten

41 Funcioacuten 142 Funcioacuten 2 con liacuteneas cambiadas

5 Recursioacuten directa e indirecta6 Veacutease tambieacuten7 Notas y referencias8 Enlaces externos

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 213

Algoritmos recursivosUn meacutetodo frecuente para simplificar es dividir un problema en problemas maacutes derivados de menor tamantildeodel mismo tipo Esto se conoce como dialecting Coacutemo teacutecnica de programacioacuten se denomina divide yvenceraacutes y es pieza fundamental para el disentildeo de muchos algoritmos de importancia asiacute como parteesencial de la programacioacuten dinaacutemica

Virtualmente todos los lenguajes de programacioacuten modernos permiten la especificacioacuten directa de funcionesy subrutinas recursivas Cuando se llama una funcioacuten de este tipo el ordenador para la mayoriacutea de loslenguajes en casi todas las arquitecturas basadas en una pila (stack) o en la implementacioacuten del lenguajelleva la cuenta de las distintas instancias de la funcioacuten en numerosas arquitecturas mediante el uso de uncall stack aunque no de forma exclusiva A la inversa toda funcioacuten recursiva puede transformarse en unafuncioacuten iterativa usando un stack

La mayoriacutea (aunque no todas) de las funciones y subrutinas que pueden ser evaluadas por un ordenadorpueden expresarse en teacuterminos de una funcioacuten recursiva (sin tener que utilizar una iteracioacuten pura) a lainversa cualquier funcioacuten recursiva puede expresarse en teacuterminos de una iteracioacuten pura dado que larecursioacuten es de por siacute tambieacuten iterativa Para evaluar una funcioacuten por medio de la recursioacuten tiene quedefinirse como una funcioacuten de si misma (ej el factor n = n (n - 1) donde 0 se define como 1) Resultaevidente que no todas las evaluaciones de funciones se prestan a un acercamiento recursivo Por lo generaltodas las funciones finitas pueden describirse directamente de forma recursiva las funciones infinitas (ej lasseries de e = 11 + 22 + 33) necesitan un criterio extra para detenerse ej el nuacutemero de iteraciones o elnuacutemero de diacutegitos significativos en caso contrario una iteracioacuten recursiva resultariacutea en un bucle infinito

A modo de ilustracioacuten Si se encuentra una palabra desconocida en un libro el lector puede anotar la paacuteginaactual en un papel y ponerlo en una pila (hasta entonces vaciacutea) El lector consulta la palabra en otro artiacuteculoy de nuevo descubre otra palabra desconocida la anota y la pone en la pila y asiacute sucesivamente Llega unmomento que el lector lee un artiacuteculo que donde todas las palabras son conocidas El lector retorna entoncesa la uacuteltima paacutegina y continua la lectura desde ahiacute y asiacute hasta que se retira la uacuteltima nota de la pilaretornando entonces al libro original Este modus operandi es recursivo

Algunos lenguajes disentildeados para programacioacuten loacutegica y programacioacuten funcional ofrecen la recursioacuten comoel uacutenico medio de repeticioacuten directa disponible para el programador Estos lenguajes suelen conseguir que larecursioacuten de cola sea tan eficiente como la iteracioacuten permitiendo a los programadores expresar otrasestructuras repetitivas (tales como map y for de scheme) en teacuterminos de recursioacuten

La recursioacuten estaacute profundamente anclada en la teoriacutea de computacioacuten con la equivalencia teoacuterica de funcioacutenmicrorecursiva y maacutequinas de Turing en la cimentacioacuten de ideas sobre la universalidad del ordenadormoderno

Programacioacuten recursivaCrear una subrutina recursiva requiere principalmente la definicioacuten de un caso base y entonces definirreglas para subdividir casos maacutes complejos en el caso base Para una subrutina recursiva es esencial que concada llamada recursiva el problema se reduzca de forma que al final llegue al caso base

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 313

Algunos expertos clasifican la recursioacuten como generativa o bien estructural La distincioacuten se hace seguacutende donde provengan los datos con los que trabaja la subrutina Si los datos proceden de una estructura dedatos similar a una lista entonces la subrutina es estructuralmente recursiva en caso contrario esgenerativamente recursiva4

Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datosaportados y recurren a partir de ahiacute HTDP (How To Design Programs) al espantildeol Coacutemodisentildear programas se refiere a esta variante como recursioacuten generativa Ejemplos de recursioacutengenerativa incluyen maacuteximo comuacuten divisor quicksort buacutesqueda binaria mergesort Meacutetodo deNewton fractals e integracioacuten adaptiva5

Ejemplos de subrutinas definidas recursivamente (recursioacuten generativa)

Factorial

Un ejemplo claacutesico de una subrutina recursiva es la funcioacuten usada para calcular el factorial de un entero

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

funcioacuten factorialinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 if n es 0 return 1 2 else return [ n times factorial(n-1) ]

end factorial

Una relacioacuten recurrente es una ecuacioacuten que relaciona teacuterminos posteriores en la secuencia con teacuterminosprevios6

Relacioacuten recurrente de un factorial

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 413

Computando la relacioacuten recurrente para n = 4

b4 = 4 b3 = 4 3 b2 = 4 3 2 b1 = 4 3 2 1 b0 = 4 3 2 1 1 = 4 3 2 1 = 4 3 2 = 4 6 = 24

Esta funcioacuten factorial tambieacuten puede describirse sin usar recursioacuten haciendo uso de tiacutepicas estructuras debucle que se encuentran en lenguajes de programacioacuten imperativos

Pseudocoacutedigo (iterativo)

funcioacuten factorial esinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 crear una variable nueva llamada running_total con un valor = 1

2 begin loop 1 si n es = 0 salir del loop 2 cambiar running_total a (running_total times n) 3 decrementar n 4 repetir el loop

3 return running_total

end factorial

El lenguaje de programacioacuten scheme es sin embargo un lenguaje de programacioacuten funcional y no defineestructuras de loops de cualquier tipo Se basa uacutenicamente en la recursioacuten para ejecutar todo tipo de loopsDado que scheme es recursivo de cola se puede definir una subrutina recursiva que implementa la subrutinafactorial como un proceso iterativo es decir usa espacio constante pero tiempo lineal

Fibonacci

Otra popular secuencia recursiva es el Nuacutemero de Fibonacci Los primeros elementos de la secuencia son 01 1 2 3 5 8 13 21

Definicioacuten de la funcioacuten

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 513

Pseudocoacutedigo

function fib isinput entero n de forma que n gt= 0

1 si n es = 0 return 0 2 si n es = 1 return 1 3 else return [ fib(n-1) + fib(n-2) ]

end fib

Relacioacuten recurrente para Fibonaccibn = bn-1 + bn-2b1 = 1 b0 = 0

Computando la relacioacuten recurrente para n = 4

b4 = b3 + b2 = b2 + b1 + b1 + b0 = b1 + b0 + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la funcioacuten realizaraacute dosllamadas a la funcioacuten a si misma cada una de las cuales haraacute a la vez dos llamadas maacutes y asiacute sucesivamentehasta que terminen en 0 o en 1 El ejemplo se denomina recursioacuten de aacuterbol y sus requisitos de tiempocrecen de forma exponencial y los de espacio de forma lineal7

Maacuteximo comuacuten divisor

Otro famosa funcioacuten recursiva es el algoritmo de Euclides usado para computar el maacuteximo comuacuten divisorde dos enteros

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

function gcd isinput entero x entero y de forma que x gt= y y y gt 0

1 if y is 0 return x 2 else return [ gcd( y (remainder of xy) ) ]

end gcd

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 213

Algoritmos recursivosUn meacutetodo frecuente para simplificar es dividir un problema en problemas maacutes derivados de menor tamantildeodel mismo tipo Esto se conoce como dialecting Coacutemo teacutecnica de programacioacuten se denomina divide yvenceraacutes y es pieza fundamental para el disentildeo de muchos algoritmos de importancia asiacute como parteesencial de la programacioacuten dinaacutemica

Virtualmente todos los lenguajes de programacioacuten modernos permiten la especificacioacuten directa de funcionesy subrutinas recursivas Cuando se llama una funcioacuten de este tipo el ordenador para la mayoriacutea de loslenguajes en casi todas las arquitecturas basadas en una pila (stack) o en la implementacioacuten del lenguajelleva la cuenta de las distintas instancias de la funcioacuten en numerosas arquitecturas mediante el uso de uncall stack aunque no de forma exclusiva A la inversa toda funcioacuten recursiva puede transformarse en unafuncioacuten iterativa usando un stack

La mayoriacutea (aunque no todas) de las funciones y subrutinas que pueden ser evaluadas por un ordenadorpueden expresarse en teacuterminos de una funcioacuten recursiva (sin tener que utilizar una iteracioacuten pura) a lainversa cualquier funcioacuten recursiva puede expresarse en teacuterminos de una iteracioacuten pura dado que larecursioacuten es de por siacute tambieacuten iterativa Para evaluar una funcioacuten por medio de la recursioacuten tiene quedefinirse como una funcioacuten de si misma (ej el factor n = n (n - 1) donde 0 se define como 1) Resultaevidente que no todas las evaluaciones de funciones se prestan a un acercamiento recursivo Por lo generaltodas las funciones finitas pueden describirse directamente de forma recursiva las funciones infinitas (ej lasseries de e = 11 + 22 + 33) necesitan un criterio extra para detenerse ej el nuacutemero de iteraciones o elnuacutemero de diacutegitos significativos en caso contrario una iteracioacuten recursiva resultariacutea en un bucle infinito

A modo de ilustracioacuten Si se encuentra una palabra desconocida en un libro el lector puede anotar la paacuteginaactual en un papel y ponerlo en una pila (hasta entonces vaciacutea) El lector consulta la palabra en otro artiacuteculoy de nuevo descubre otra palabra desconocida la anota y la pone en la pila y asiacute sucesivamente Llega unmomento que el lector lee un artiacuteculo que donde todas las palabras son conocidas El lector retorna entoncesa la uacuteltima paacutegina y continua la lectura desde ahiacute y asiacute hasta que se retira la uacuteltima nota de la pilaretornando entonces al libro original Este modus operandi es recursivo

Algunos lenguajes disentildeados para programacioacuten loacutegica y programacioacuten funcional ofrecen la recursioacuten comoel uacutenico medio de repeticioacuten directa disponible para el programador Estos lenguajes suelen conseguir que larecursioacuten de cola sea tan eficiente como la iteracioacuten permitiendo a los programadores expresar otrasestructuras repetitivas (tales como map y for de scheme) en teacuterminos de recursioacuten

La recursioacuten estaacute profundamente anclada en la teoriacutea de computacioacuten con la equivalencia teoacuterica de funcioacutenmicrorecursiva y maacutequinas de Turing en la cimentacioacuten de ideas sobre la universalidad del ordenadormoderno

Programacioacuten recursivaCrear una subrutina recursiva requiere principalmente la definicioacuten de un caso base y entonces definirreglas para subdividir casos maacutes complejos en el caso base Para una subrutina recursiva es esencial que concada llamada recursiva el problema se reduzca de forma que al final llegue al caso base

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 313

Algunos expertos clasifican la recursioacuten como generativa o bien estructural La distincioacuten se hace seguacutende donde provengan los datos con los que trabaja la subrutina Si los datos proceden de una estructura dedatos similar a una lista entonces la subrutina es estructuralmente recursiva en caso contrario esgenerativamente recursiva4

Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datosaportados y recurren a partir de ahiacute HTDP (How To Design Programs) al espantildeol Coacutemodisentildear programas se refiere a esta variante como recursioacuten generativa Ejemplos de recursioacutengenerativa incluyen maacuteximo comuacuten divisor quicksort buacutesqueda binaria mergesort Meacutetodo deNewton fractals e integracioacuten adaptiva5

Ejemplos de subrutinas definidas recursivamente (recursioacuten generativa)

Factorial

Un ejemplo claacutesico de una subrutina recursiva es la funcioacuten usada para calcular el factorial de un entero

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

funcioacuten factorialinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 if n es 0 return 1 2 else return [ n times factorial(n-1) ]

end factorial

Una relacioacuten recurrente es una ecuacioacuten que relaciona teacuterminos posteriores en la secuencia con teacuterminosprevios6

Relacioacuten recurrente de un factorial

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 413

Computando la relacioacuten recurrente para n = 4

b4 = 4 b3 = 4 3 b2 = 4 3 2 b1 = 4 3 2 1 b0 = 4 3 2 1 1 = 4 3 2 1 = 4 3 2 = 4 6 = 24

Esta funcioacuten factorial tambieacuten puede describirse sin usar recursioacuten haciendo uso de tiacutepicas estructuras debucle que se encuentran en lenguajes de programacioacuten imperativos

Pseudocoacutedigo (iterativo)

funcioacuten factorial esinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 crear una variable nueva llamada running_total con un valor = 1

2 begin loop 1 si n es = 0 salir del loop 2 cambiar running_total a (running_total times n) 3 decrementar n 4 repetir el loop

3 return running_total

end factorial

El lenguaje de programacioacuten scheme es sin embargo un lenguaje de programacioacuten funcional y no defineestructuras de loops de cualquier tipo Se basa uacutenicamente en la recursioacuten para ejecutar todo tipo de loopsDado que scheme es recursivo de cola se puede definir una subrutina recursiva que implementa la subrutinafactorial como un proceso iterativo es decir usa espacio constante pero tiempo lineal

Fibonacci

Otra popular secuencia recursiva es el Nuacutemero de Fibonacci Los primeros elementos de la secuencia son 01 1 2 3 5 8 13 21

Definicioacuten de la funcioacuten

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 513

Pseudocoacutedigo

function fib isinput entero n de forma que n gt= 0

1 si n es = 0 return 0 2 si n es = 1 return 1 3 else return [ fib(n-1) + fib(n-2) ]

end fib

Relacioacuten recurrente para Fibonaccibn = bn-1 + bn-2b1 = 1 b0 = 0

Computando la relacioacuten recurrente para n = 4

b4 = b3 + b2 = b2 + b1 + b1 + b0 = b1 + b0 + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la funcioacuten realizaraacute dosllamadas a la funcioacuten a si misma cada una de las cuales haraacute a la vez dos llamadas maacutes y asiacute sucesivamentehasta que terminen en 0 o en 1 El ejemplo se denomina recursioacuten de aacuterbol y sus requisitos de tiempocrecen de forma exponencial y los de espacio de forma lineal7

Maacuteximo comuacuten divisor

Otro famosa funcioacuten recursiva es el algoritmo de Euclides usado para computar el maacuteximo comuacuten divisorde dos enteros

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

function gcd isinput entero x entero y de forma que x gt= y y y gt 0

1 if y is 0 return x 2 else return [ gcd( y (remainder of xy) ) ]

end gcd

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 313

Algunos expertos clasifican la recursioacuten como generativa o bien estructural La distincioacuten se hace seguacutende donde provengan los datos con los que trabaja la subrutina Si los datos proceden de una estructura dedatos similar a una lista entonces la subrutina es estructuralmente recursiva en caso contrario esgenerativamente recursiva4

Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datosaportados y recurren a partir de ahiacute HTDP (How To Design Programs) al espantildeol Coacutemodisentildear programas se refiere a esta variante como recursioacuten generativa Ejemplos de recursioacutengenerativa incluyen maacuteximo comuacuten divisor quicksort buacutesqueda binaria mergesort Meacutetodo deNewton fractals e integracioacuten adaptiva5

Ejemplos de subrutinas definidas recursivamente (recursioacuten generativa)

Factorial

Un ejemplo claacutesico de una subrutina recursiva es la funcioacuten usada para calcular el factorial de un entero

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

funcioacuten factorialinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 if n es 0 return 1 2 else return [ n times factorial(n-1) ]

end factorial

Una relacioacuten recurrente es una ecuacioacuten que relaciona teacuterminos posteriores en la secuencia con teacuterminosprevios6

Relacioacuten recurrente de un factorial

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 413

Computando la relacioacuten recurrente para n = 4

b4 = 4 b3 = 4 3 b2 = 4 3 2 b1 = 4 3 2 1 b0 = 4 3 2 1 1 = 4 3 2 1 = 4 3 2 = 4 6 = 24

Esta funcioacuten factorial tambieacuten puede describirse sin usar recursioacuten haciendo uso de tiacutepicas estructuras debucle que se encuentran en lenguajes de programacioacuten imperativos

Pseudocoacutedigo (iterativo)

funcioacuten factorial esinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 crear una variable nueva llamada running_total con un valor = 1

2 begin loop 1 si n es = 0 salir del loop 2 cambiar running_total a (running_total times n) 3 decrementar n 4 repetir el loop

3 return running_total

end factorial

El lenguaje de programacioacuten scheme es sin embargo un lenguaje de programacioacuten funcional y no defineestructuras de loops de cualquier tipo Se basa uacutenicamente en la recursioacuten para ejecutar todo tipo de loopsDado que scheme es recursivo de cola se puede definir una subrutina recursiva que implementa la subrutinafactorial como un proceso iterativo es decir usa espacio constante pero tiempo lineal

Fibonacci

Otra popular secuencia recursiva es el Nuacutemero de Fibonacci Los primeros elementos de la secuencia son 01 1 2 3 5 8 13 21

Definicioacuten de la funcioacuten

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 513

Pseudocoacutedigo

function fib isinput entero n de forma que n gt= 0

1 si n es = 0 return 0 2 si n es = 1 return 1 3 else return [ fib(n-1) + fib(n-2) ]

end fib

Relacioacuten recurrente para Fibonaccibn = bn-1 + bn-2b1 = 1 b0 = 0

Computando la relacioacuten recurrente para n = 4

b4 = b3 + b2 = b2 + b1 + b1 + b0 = b1 + b0 + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la funcioacuten realizaraacute dosllamadas a la funcioacuten a si misma cada una de las cuales haraacute a la vez dos llamadas maacutes y asiacute sucesivamentehasta que terminen en 0 o en 1 El ejemplo se denomina recursioacuten de aacuterbol y sus requisitos de tiempocrecen de forma exponencial y los de espacio de forma lineal7

Maacuteximo comuacuten divisor

Otro famosa funcioacuten recursiva es el algoritmo de Euclides usado para computar el maacuteximo comuacuten divisorde dos enteros

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

function gcd isinput entero x entero y de forma que x gt= y y y gt 0

1 if y is 0 return x 2 else return [ gcd( y (remainder of xy) ) ]

end gcd

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 413

Computando la relacioacuten recurrente para n = 4

b4 = 4 b3 = 4 3 b2 = 4 3 2 b1 = 4 3 2 1 b0 = 4 3 2 1 1 = 4 3 2 1 = 4 3 2 = 4 6 = 24

Esta funcioacuten factorial tambieacuten puede describirse sin usar recursioacuten haciendo uso de tiacutepicas estructuras debucle que se encuentran en lenguajes de programacioacuten imperativos

Pseudocoacutedigo (iterativo)

funcioacuten factorial esinput entero n de forma que n gt= 0output [n times (n-1) times (n-2) times hellip times 1]

1 crear una variable nueva llamada running_total con un valor = 1

2 begin loop 1 si n es = 0 salir del loop 2 cambiar running_total a (running_total times n) 3 decrementar n 4 repetir el loop

3 return running_total

end factorial

El lenguaje de programacioacuten scheme es sin embargo un lenguaje de programacioacuten funcional y no defineestructuras de loops de cualquier tipo Se basa uacutenicamente en la recursioacuten para ejecutar todo tipo de loopsDado que scheme es recursivo de cola se puede definir una subrutina recursiva que implementa la subrutinafactorial como un proceso iterativo es decir usa espacio constante pero tiempo lineal

Fibonacci

Otra popular secuencia recursiva es el Nuacutemero de Fibonacci Los primeros elementos de la secuencia son 01 1 2 3 5 8 13 21

Definicioacuten de la funcioacuten

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 513

Pseudocoacutedigo

function fib isinput entero n de forma que n gt= 0

1 si n es = 0 return 0 2 si n es = 1 return 1 3 else return [ fib(n-1) + fib(n-2) ]

end fib

Relacioacuten recurrente para Fibonaccibn = bn-1 + bn-2b1 = 1 b0 = 0

Computando la relacioacuten recurrente para n = 4

b4 = b3 + b2 = b2 + b1 + b1 + b0 = b1 + b0 + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la funcioacuten realizaraacute dosllamadas a la funcioacuten a si misma cada una de las cuales haraacute a la vez dos llamadas maacutes y asiacute sucesivamentehasta que terminen en 0 o en 1 El ejemplo se denomina recursioacuten de aacuterbol y sus requisitos de tiempocrecen de forma exponencial y los de espacio de forma lineal7

Maacuteximo comuacuten divisor

Otro famosa funcioacuten recursiva es el algoritmo de Euclides usado para computar el maacuteximo comuacuten divisorde dos enteros

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

function gcd isinput entero x entero y de forma que x gt= y y y gt 0

1 if y is 0 return x 2 else return [ gcd( y (remainder of xy) ) ]

end gcd

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 513

Pseudocoacutedigo

function fib isinput entero n de forma que n gt= 0

1 si n es = 0 return 0 2 si n es = 1 return 1 3 else return [ fib(n-1) + fib(n-2) ]

end fib

Relacioacuten recurrente para Fibonaccibn = bn-1 + bn-2b1 = 1 b0 = 0

Computando la relacioacuten recurrente para n = 4

b4 = b3 + b2 = b2 + b1 + b1 + b0 = b1 + b0 + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la funcioacuten realizaraacute dosllamadas a la funcioacuten a si misma cada una de las cuales haraacute a la vez dos llamadas maacutes y asiacute sucesivamentehasta que terminen en 0 o en 1 El ejemplo se denomina recursioacuten de aacuterbol y sus requisitos de tiempocrecen de forma exponencial y los de espacio de forma lineal7

Maacuteximo comuacuten divisor

Otro famosa funcioacuten recursiva es el algoritmo de Euclides usado para computar el maacuteximo comuacuten divisorde dos enteros

Definicioacuten de la funcioacuten

Pseudocoacutedigo (recursivo)

function gcd isinput entero x entero y de forma que x gt= y y y gt 0

1 if y is 0 return x 2 else return [ gcd( y (remainder of xy) ) ]

end gcd

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 613

Relacioacuten recursiva del maacuteximo comuacuten denominador donde expresa el resto de la divisioacuten entera

Computando la relacioacuten recurrente para x = 27 e y = 9

gcd(27 9) = gcd(9 27 9) = gcd(9 0) = 9

Computando la relacioacuten recurrente para x = 259 e y = 111

gcd(259 111) = gcd(111 259 111) = gcd(111 37) = gcd(37 0) = 37

Noacutetese que el algoritmo recursivo mostrado arriba es de hecho uacutenicamente de cola recursiva lo quesignifica que es equivalente a un algoritmo iterativo En el ejemplo siguiente se muestra el mismo algoritmousando expliacutecitamente iteracioacuten No acumula una cadena de operaciones deferred sino que su estado esmaacutes bien mantenido completamente en las variables x e y Su number of steps grows the as the logarithmof the numbers involved 8 al espantildeol nuacutemero de pasos crece a medida que lo hace el logaritmo de losnuacutemeros involucrados

Pseudocoacutedigo

funcioacuten gcd esinput entero x entero y de forma que x gt= y e y gt 0

1 crear una nueva variable llamada remainder

2 begin loop 1 if y is zero exit loop 2 set remainder to the remainder of xy 3 set x to y 4 set y to remainder 5 repeat loop

3 return x

end gcd

El algoritmo iterativo requiere una variable temporal e incluso supuesto el conocimiento del Algoritmo deEuclides es maacutes difiacutecil de entender el proceso a simple vista aunque los dos algoritmos son muy similaresen sus pasos

Torres de Hanoacutei

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 713

Para una detallada discusioacuten de la descripcioacuten de este problema de su historia y de su solucioacuten consuacutelteseel artiacuteculo principal9 10 El problema puesto de forma simple es el siguiente Dadas 3 pilas una con unconjunto de N discos de tamantildeo creciente determina el miacutenimo (oacuteptimo) nuacutemero de pasos que lleva movertodos los discos desde su posicioacuten inicial a otra pila sin colocar un disco de mayor tamantildeo sobre uno demenor tamantildeo

Definicioacuten de la funcioacuten

Relacioacuten de recurrencia para hanoi

Computacioacuten de la relacioacuten de recurrencia para n = 4

hanoi(4) = 2hanoi(3) + 1 = 2(2hanoi(2) + 1) + 1 = 2(2(2hanoi(1) + 1) + 1) + 1 = 2(2(21 + 1) + 1) + 1 = 2(2(3) + 1) + 1 = 2(7) + 1 = 15

Ejemplos de implementacioacuten

Pseudocoacutedigo (recursivo)

function hanoi isinput integer n such that n gt= 1

1 if n is 1 then return 1

2 return [2 [call hanoi(n-1)] + 1]

end hanoi

Aunque no todas las funciones recursivas tienen una solucioacuten expliacutecita la secuencia de la Torre de Hanoacuteipuede reducirse a una foacutermula expliacutecita11

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 813

Una formula expliacutecita de las Torres de Hanoacutei

h1 = 1 = 21 - 1

h2 = 3 = 22 - 1

h3 = 7 = 23 - 1

h4 = 15 = 24 - 1

h5 = 31 = 25 - 1

h6 = 63 = 26 - 1

h7 = 127 = 27 - 1

Por lo generalhn = 2

n - 1 for all n gt= 1

Buacutesqueda binaria

El algoritmo de buacutesqueda binaria es un meacutetodo de buacutesqueda de un dato en un vector de datos ordenadodividiendo el vector en dos tras cada pasada El truco es escoger un punto cerca del centro del vectorcomparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3condiciones se encuentra el dato buscado el dato en el punto medio es mayor que el valor buscado o el datoen el punto medio es menor que el valor buscado

Se usa recursioacuten en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en orginal endos La subrutina de buacutesqueda binaria se llama entonces de forma recursiva cada vez con un vector demenor tamantildeo El tamantildeo del vector se ajusta normalmente cambiando el iacutendice inicial y final El algoritmomuestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dostras cada pasada

Ejemplo de implementacioacuten de la buacutesqueda binaria

Call binary_search with proper initial conditions Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar count es el nuacutemero total de elementos del vector Salida resultado de la buacutesqueda binaria int search(int data int toFind int count) Start = 0 (iacutendice inicial) End = count - 1 (iacutendice superior) return binary_search(data toFind 0 count-1)

Algoritmo de la buacutesqueda binaria Entrada Los datos se presentan en forma de vector de [[nuacutemero entero|nuacutemeros enteros]] ordenado de forma ascendente toFind es el nuacutemero entero a buscar start es el iacutendice miacutenimo del vector end es el iacutendice maacuteximo del vector

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 913

Salida posicioacuten del nuacutemero entero toFind dentro del vector de datos -1 en caso de buacutesqueda fallida int binary_search(int data int toFind int start int end) Averigua el punto medio int mid = start + (end - start)2 Divisioacuten de enteros Condicioacuten para detenerse if (start gt end) return -1 else if (data[mid] == toFind) Encontrado return mid else if (data[mid] gt toFind) El dato es mayor que toFind se busca en la mitad inferior return binary_search(data toFind start mid-1) else El dato es menor que toFind se busca en la mitad superior return binary_search(data toFind mid+1 end)

Estructuras de datos recursivo (recursioacuten estructural)

Una aplicacioacuten de importancia de la recursioacuten en ciencias de la computacioacuten es la definicioacuten de estructurasde datos dinaacutemicos tales como listas y aacuterboles Las estructuras de datos recursivos pueden crecer de formadinaacutemica hasta un tamantildeo teoacuterico infinito en respuesta a requisitos del tiempo de ejecucioacuten por su parte losrequisitos del tamantildeo de un vector estaacutetico deben declararse en el tiempo de complicacioacuten

Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o losdatos que manejar son definidos en teacuterminos recursivos12

Los ejemplos en esta seccioacuten ilustran lo que se conoce como recursioacuten estructural Este teacutermino se refiereal hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva

En la medida en que un programador deriva una plantilla de una definicioacuten de datos lasfunciones emplean recursioacuten estructural Es decir las recursiones en el cuerpo de una funcioacutenconsumen una determinada cantidad de un compuesto dado de forma inmediata13

Listas enlazadas

A continuacioacuten se describe una definicioacuten simple del nodo de una lista enlazada Noacutetese como se define elnodo por si solo El siguiente elemento del nodo del struct es un puntero a un nodo de struct

struct node int n alguacuten tipo de datos struct node next puntero a otro nodo de struct

LIST no es otra cosa que un nodo de struct typedef struct node LIST

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural comouna subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de formarecursiva La subrutina printList definida a continuacioacuten recorre la lista hacia abajo hasta que eacutesta se vaciacutea

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1013

(NULL) para cada nodo imprime el dato (un nuacutemero entero) En la implementacioacuten en C la listapermanece inalterada por la subrutina printList

void printList(LIST lst) if (isEmpty(lst)) caso baacutesico printf(d lst-gtn) imprime el entero seguido por un espacio printList(lst-gtnext) llamada recursiva

Aacuterboles binarios

Maacutes abajo se muestra una definicioacuten simple de un nodo de aacuterbol binario Al igual que el nodo de listasenlazadas se define a siacute misma (de forma recursiva) Hay dos punteros que se refieren a siacute mismos ndash left(apuntando a l aparte izquierda del subaacuterbol) y right (a la parte derecha del subaacuterbol)

struct node int n alguacuten tipo de datos struct node left puntero al subaacuterbol izquierdo struct node right puntero al subaacuterbol derecho

TREE no es otra cosa que un nodo struct typedef struct node TREE

Las operaciones en el aacuterbol pueden implementarse usando recursioacuten Noacutetese que debido al hecho de quehay dos punteros que se referencian a siacute mismos (izquierda y derecha) esas operaciones del aacuterbol van anecesitar dos llamadas recursivas Para un ejemplo similar veacutease la funcioacuten de Fibonacci y la explicacioacutensiguiente

void printTree(TREE t) if (isEmpty(t)) caso baacutesico printTree(t-gtleft) ir a la izquierda printf(d t-gtn) imprimir el entero seguido de un espacio printTree(t-gtright) ir a la derecha

El ejemplo descrito ilustra un aacuterbol binario de orden transversal Un aacuterbol de buacutesqueda binaria es un casoespecial de aacuterbol binario en el cual los datos de cada aacuterbol estaacuten en orden

Recursioacuten frente a iteracioacuten

En el ejemplo factorial la implementacioacuten iterativa es probablemente maacutes raacutepida en la praacutectica que larecursiva Esto es casi definido por la implementacioacuten del algoritmo euclideano Este resultado es loacutegicopues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de lasfunciones recursivas y ese exceso es relativamente alto en muchos lenguajes de programacioacuten (noacutetese quemediante el uso de una lookup table es una implementacioacuten auacuten maacutes raacutepida de la funcioacuten factorial)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1113

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas porque estar al tanto delestado anterior Un ejemplo es el aacuterbol transversal otros incluyen la funcioacuten de Ackermann y el algoritmodivide y venceraacutes tales como Quicksort Todos estos algoritmos pueden implementarse iterativamente con laayuda de una pila pero la necesidad del mismo puede que anule las ventajas de la solucioacuten iterativa

Otra posible razoacuten para la utilizacioacuten de un algoritmo iterativo en lugar de uno recursivo es el hecho de queen los lenguajes de programacioacuten modernos el espacio de stack disponible para un hilo es a menudomucho menos que el espacio disponible en el montiacuteculo y los algoritmos recursivos suelen requerir maacutesespacio de stack que los algoritmos iterativos Veacutease por otro lado la seccioacuten siguiente que trata el casoespecial de la recursioacuten de cola

Funciones de recursioacuten de colaFunciones de recursioacuten de cola son funciones que finalizan con una llamada recursiva que no crea ningunaoperacioacuten deferida Por ejemplo la funcioacuten gcd (se muestra de nuevo maacutes abajo) es recursiva de cola sinembargo la funcioacuten factorial (que tambieacuten se muestra maacutes abajo) no es recursiva de cola porque creaoperaciones diferidas que tienen que realizarse incluso despueacutes de que se complete la uacuteltima llamadarecursiva Con un compilador que automaacuteticamente optimiza llamadas recursivas de cola una funcioacutenrecursiva de cola como por ejemplo gcd se ejecutaraacute usando un espacio constante Asiacute el proceso quegenera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo comolos bucles for y while

Recusioacuten de cola Recursioacuten en aumento

Entrada Los enteros x e y de forma que x gt= y e y gt 0int gcd(int x int y) if (y == 0) return x else return gcd(y x y)

Entrada n es un entero de forma que n gt= 1int fact(int n) if (n == 1) return 1 else return n fact(n - 1)

La importancia de recursioacuten de cola es que cuando se realiza una llamada recursiva de cola la posicioacuten deretorno de la funcioacuten que llama necesita grabarse en el call stack cuando la funcioacuten recursiva retornacontinuaraacute directamente a partir de la posicioacuten de retorno grabada previamente Por ello en compiladoresque dan soporte a optimizacioacuten de recursioacuten de cola este tipo de recursioacuten ahorra espacio y tiempo

Orden en el llamamiento de una funcioacutenEl orden de llamamiento de una funcioacuten puede alterar la ejecucioacuten de una funcioacuten veacutease este ejemplo en C

Funcioacuten 1

void recursiveFunction(int num) if (num lt 5) printf(dn num) recursiveFunction(num + 1)

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1213

Funcioacuten 2 con liacuteneas cambiadas

void recursiveFunction(int num) if (num lt 5) recursiveFunction(num + 1) printf(dn num)

Recursioacuten directa e indirectaSe habla de recursioacuten directa cuando la funcioacuten se llama a siacute misma Se habla de recursioacuten indirecta cuandopor ejemplo una funcioacuten A llama a una funcioacuten B que a su vez llama a una funcioacuten C la cual llama a lafuncioacuten De esta forma es posible crear largas cadenas y ramificaciones veacutease Parser descendente recursivo

Veacutease tambieacutenRecursioacuten primitivaProgramacioacuten funcionalFuncioacuten de Ackermann

Notas y referenciasEsta obra deriva de la traduccioacuten de Recursion (computer science) de Wikipedia eningleacutes concretamente de esta versioacuten (httpsenwikipediaorgwikiRecursion_(computer_science)oldid=281278816) publicada por sus editores(httpsenwikipediaorgwikiRecursion_(computer_science)action=history) bajo la Licencia dedocumentacioacuten libre de GNU y la Licencia Creative Commons Atribucioacuten-CompartirIgual 30

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro

2492015 Recursioacuten (ciencias de computacioacuten) - Wikipedia la enciclopedia libre

httpseswikipediaorgwikiRecursiC3B3n_(ciencias_de_computaciC3B3n) 1313

Unported

1 Epp Susanna (1995) Discrete Mathematics with Application (2 edicioacuten) p 4272 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Capiacutetulo 1 Recurrent Problems3 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 1264 Felleisen Matthias Robert Bruce Findler Matthew Flatt Shriram Krishnamurthi (2001) How to Design

Programs An Introduction to Computing and Programming (httpwwwhtdporg2003-09-26Bookcurriculum-Z-H-31html) Cambridge MASS MIT Press p art V Generative Recursion

5 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo En Jeuring Johan Advanced FunctionalProgramming 4th International School Oxford Reino Unido Springer p 108

6 Epp Susanna (1995) Discrete Mathematics with Applications Brooks-Cole Publishing Company p 4247 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_122) Seccioacuten 1228 Abelson Harold Gerald Jay Sussman (1996) Structure and Interpretation of Computer Programs

(httpmitpressmitedusicpfull-textbookbook-Z-H-11html_sec_125) Section 1259 Graham Ronald Donald Knuth Oren Patashnik (1990) Concrete Mathematics (httpwww-cs-

facultystanfordedu~knuthgkphtml) Chapter 1 Section 11 The Tower of Hanoi10 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 427ndash430 The Tower of Hanoi11 Epp Susanna (1995) Discrete Mathematics with Applications (2nd edicioacuten) pp 447ndash448 An Explicit Formula

for the Tower of Hanoi Sequence12 Wirth Niklaus (1976) Algorithms + Data Structures = Programs Prentice-Hall p 12713 Felleisen Matthias (2002) laquoDeveloping Interactive Web Programsraquo Advanced Functional Programming 4th

International School Oxford UK Springer pp 108

Enlaces externosHarold Abelson and Gerald Sussman Structure and Interpretation Of Computer Programs(httpmitpressmitedusicpfull-textbookbookhtml)IBM DeveloperWorks Mastering Recursive Programming (httpwww-128ibmcomdeveloperworkslinuxlibraryl-recurshtml)David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation(httpwwwcscmuedu~dstLispBook)Matthias Felleisen How To Design Programs An Introduction to Computing and Programming(httpwwwhtdporg2003-09-26Book)

Obtenido de laquohttpseswikipediaorgwindexphptitle=Recursioacuten_(ciencias_de_computacioacuten)ampoldid=82065862raquo

Categoriacuteas Informaacutetica teoacuterica Subrutinas Loacutegica matemaacutetica

Esta paacutegina fue modificada por uacuteltima vez el 27 abr 2015 a las 1404El texto estaacute disponible bajo la Licencia Creative Commons Atribucioacuten Compartir Igual 30 podriacuteanser aplicables claacuteusulas adicionales Leacuteanse los teacuterminos de uso para maacutes informacioacutenWikipediareg es una marca registrada de la Fundacioacuten Wikimedia Inc una organizacioacuten sin aacutenimo delucro