Ejemplo del uso del estatuto de control condicional “if(condición

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