2.4.2 Funciones o Módulos múltiples Uno de los objetivos es subdividir la solución de un problema en subproblemas y escribir un módulo para solucionar cada subproblema previamente identificado. La característica principal de un modulo o función es que tenga una longitud no mayor a una pantalla de la computadora, y que la función o modulo resuelva una tarea simple, concreta y especifica, como parte de la solución completa que se esta diseñando. • Ejemplo de Funciones o Módulos múltiples: Descripción de la tarea del Robot Karel: Karel se encuentra en dirección Este, y a una distancia no conocida hay una barda que crece hacia el norte, a lo largo de esta barda, en algunas esquinas hay trompos que Karel deberá ir levantando, y al terminar la barda deberá dejar, en esa esquina, todos los trompos que levanto, luego, que Karel gire a su izquierda y se detenga después de avanzar una cuadra. Posición y dirección inicial del Robot Karel: Karel arranca con dirección Este, en la esquina más al SurOeste de su mundo, y sin trompos en la mochila. MUNDO INICIAL PROGRAMA: MUNDO FINAL en cada ocasión. y luego regresar hasta llegar de nuevo a la esquina desde donde inicio su tarea. con lo que indicamos la cantidad de veces a repetir una o mas instrucciones. a su vez. el lenguaje de “Karel el Robot” permite que al llamar a un modulo o función le enviemos a la función invocada. también.3 Uso de parámetros Así como lo hacemos cuando utilizamos el estatuto de control de repetición “iterate(n)”. es diseñar una función a la que le enviamos un valor que le indica a la función la cantidad de veces que el Robot debe girar a su izquierda. entre paréntesis. se requiere que el Robot gire distinta cantidad de veces a su izquierda. en el limite SurOeste de la ciudad y debe avanzar hasta la barda que se encuentra al Este y crece hacia el Norte. MUNDO INICIAL PROGRAMA: MUNDO FINAL . el valor de un parámetro que será recibido en otro parámetro. • Ejemplo de uso de parámetros: Descripción de la tarea del Robot Karel: Imagina que estas escribiendo un programa en el que. Posición y dirección inicial del Robot Karel: Karel inicia en dirección Este. que se recibió. Karel arranca con dirección Este y sin trompos en la mochila.2.4. en distintos segmentos del código. al llegar a la barda debe recorrerla al Norte. como parámetro dentro de la función desde donde hacemos la llamada a esta otra función. El valor del parámetro puede ser un valor numérico constante o bien el nombre de una variable. que escribimos entre paréntesis al definir la nueva función invocada. un valor numérico constante. en el que incluimos. La solución más eficiente a esto. Karel carga a memoria una copia de su código. y en ocasiones más simples. dentro de un “if(condicion)”. en ese momento. de llamarse así misma. mientras se cumpla la “condición” desde la cual se esta haciendo la llamada recursiva. “puntoDeRegreso” } } levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ).5.1 RECURSIVIDAD EN KAREL Recursividad El tema de la recursividad en los lenguajes de programación. al menos con soluciones prácticas. “puntoDeRegreso” } } levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ). porque se incluye la copia de la primer llamada). la tarea del robot es levantar los “n” trompos. se dice que es recursiva cuando se invoca así misma desde algún punto. Suponga que Karel esta en una esquina donde hay “n” trompos o zumbadores. “puntoDeRegreso” } } “CuartaCopiaDeLaFuncion” “QuintaCopiaDeLaFuncion” “SextaCopiaDeLaFuncion” levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ). digamos la “funcionRecursivaX( )”. veamos una imagen de las copias de la función “levantaYAvanza( )” que Karel carga a memoria por cada llamada recursiva que ocurre en este proceso. que Karel tiene que levantar 5 trompos o zumbadores. que le da al lenguaje una gran capacidad para resolver problemas complejos con soluciones cortas. y la copia anterior la deja pendiente de ser terminada. y luego avanzar 5 cuadras (son seis copias de la función. que deberá avanzar una cantidad de cuadras igual a la cantidad de “n” de trompos que levanto. es invocada por primera vez. este proceso. en la misma dirección en que inicio su tarea. usaremos una función recursiva con el nombre “levantaYAvanza( )”.5 2. es un tema muy interesante y muy poderoso. “puntoDeRegreso” } } levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ).2. recursiva. es decir. Demostración de como funciona la recursividad Para completar de explicar la recursividad veremos un ejemplo sencillo. que aunque puede ser resuelto con dos “while( )'s”. lo resolveremos con recursividad. como cualquier otra función. incluso hay problemas que sin recursividad no seria posible resolverlos. es decir. cargar otra copia de la función recursiva y dejar pendiente de terminar la función actual. “puntoDeRegreso” } } . Pero antes. lo interesante inicia cuando. obviamente. en base a la evaluación de una “condición”. Pues bien. ocurre la llamada o invocación a la misma función “funcionRecursivaX( )”. “PrimerCopiaDeLaFuncion” “SegundaCopiaDeLaFuncion” “TercerCopiaDeLaFuncion” levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ). se estaría repitiendo. desde adentro de su código. en el que “n” es igual a 5. Enseguida esta el código para este ejemplo. “puntoDeRegreso” } } levantaYAvanza( ){ if(---){ ----LevantaYAvanza( ). Cuando una función. pero Karel se va acordar que dejo pendiente de terminar esa primera copia de la función “funcionRecursivaX( )”. y luego que avance un numero equivalente de “n” cuadras. Karel carga a memoria otra copia de la función invocada. Una función. colocando 5 trompos. por cada trompo que levanto ocurrió una llamada recursiva. se llevan a cabo cinco llamadas recursivas. y confirmaras lo que se explicó en las líneas anteriores. El proceso descrito en el párrafo anterior.Como ya se comento. pero. es que el robot llevo la cuenta de cuantos trompos levanto. ya que. para terminar de procesarla. MUNDO INICIAL PROGRAMA: MUNDO FINAL . su regreso es en la línea donde dice “puntoDeRegreso”. entre otras cosas. y con la llamada original desde “program( )” se completan las seis copias de la función recursiva que aparecen arriba. el hecho de que Karel regresa al “puntoDeRegreso” <<tantas veces>> como llamadas recursivas ocurrieron. entonces termina el proceso repetitivo de llamadas recursivas. incluye. te invitamos a que pruebes el programa anterior. es decir. Karel carga a memoria una nueva copia de la función invocada. el robot regresa a la quinta copia de la función. Comprobación Para experimentar el comportamiento de Karel con una función recursiva. hasta terminar de procesar todas las copias que Karel había dejado pendientes de procesar. una vez que termina de procesar esta sexta copia. cada vez que ocurre una llamada recursiva. en una de las esquinas del mundo de Karel y coloca al Robot en esa misma esquina. en ese momento. cada vez en la copia anterior. entonces. lo que sucedió en este ejemplo. En el momento en que ya no se cumple la condición del “if”. en este ejemplo. luego pruébalo. Estos regresos del robot permiten que se lleve a cabo un proceso de “conteo”. desde donde se hace la llamada recursiva. Karel termina de procesar esta quinta copia y repite el proceso de estar regresando a la copia anterior en el mismo “puntoDeRegreso”. Karel terminara de procesar el código de la sexta copia de la función recursiva. y con suficientes trompos en la mochila para cumplir con su tarea. la cantidad de trompos necesarios para completar el mismo numero de bardas que encontró en toda su trayectoria. en el limite SurOeste de su mundo. y a lo largo de una distancia no conocida. se encuentran bardas que deberá brincar e ir contándolas. Karel debe dejar. Posición y dirección inicial del Robot Karel: Karel arranca con dirección Este. en la esquina más al SurOeste de su mundo. Para terminar su tarea. su tarea termina al encontrar un trompo o zumbador que le indicara el fin de su camino. en la misma esquina en donde encontró un trompo.• Ejemplo de recursividad para contar bardas: Descripción de la tarea del Robot Karel: Karel se encuentra en dirección Este. MUNDO INICIAL PROGRAMA: MUNDO FINAL . al usar un argumento “p” en la función succ(p). decrementa (es decir. permite ir contando cada llamada recursiva. tienen su utilidad cada vez que se hace una llamada a una función recursiva. y a una distancia no conocida. la tarea de Karel es contar la cantidad de cuadras que hay desde su posición inicial hasta llegar a la barda. y con suficientes trompos en la mochila para cumplir con su tarea. en repetidas llamadas de una función recursiva. se encuentra una barda que crece hacia el norte. incrementa (es decir. • Ejemplo de recursividad usando la función succ( p ): Descripción de la tarea del Robot Karel: Karel se encuentra en dirección Este. una cantidad de trompos igual a la cantidad de cuadras que hay desde su posición inicial hasta la barda. luego que regrese al sitio desde donde inicio su tarea. puede ser usado para distintos propósitos en las funciones recursivas. cuenta con dos funciones muy útiles. MUNDO INICIAL PROGRAMA: MUNDO FINAL .2 La función succ( ) y pred( ): El lenguaje Karel el Robot. A continuación se muestra un ejemplo con el uso de esta función “succ(p)”. en la esquina más al SurOeste de su mundo. El uso de la función succ(p). Estas dos funciones. La función succ(parametro). desde adentro de la misma función recursiva.5. en la esquina junto a la barda. le resta uno) en uno el valor del “parámetro” al momento de llamar a otra función. La función pred (parametro). Posición y dirección inicial del Robot Karel: Karel inicia con dirección Este. succ( p ).2. obviamente. una para incrementar y otra para decrementar el argumento usado al momento de llamar a otra función o nueva tarea. este valor del argumento “p”. una vez que Karel llegue a la barda deberá dejar. al estar invocando a una función recursiva. en el limite SurOeste de su mundo. en este ejemplo se ilustrar como podemos aprovechar la ventaja de estar incrementando en uno el valor de un parámetro. le suma uno) en uno el valor del “parámetro” al momento de llamar a otra función. y pred( p ).