Está en la página 1de 10

Manual de Karel avanzado

Karel no puede hacer algo como y= ((f^p)+7)/q es decir, no soporta signos ni operaciones. Sin
embargo, hay maneras de elevar un número al cuadrado, de sumar, de restar, de dividir
etcétera.

Por ejemplo, sumar.

Debes sumar lo que hay en las coordenadas (1,1) y en (1,2). Una manera de hacerlo es
recogiendo todos los zumbadores en (1,1) y todos en (1,2) y después dejarlos.

Es decir, suponiendo que Karel ya está en (1,1) y viendo al norte.

Código:
mientras junto-a-zumbador hacer coge-zumbador; (* Coge todos los zumbadores en 1,1*)
repetir 3 veces gira-izquierda; (*giro a la derecha*)
avanza; (*avanzo*)
mientras junto-a-zumbador hacer coge-zumbador; (*Coge todos los zumbadores en 1,2*)
repetir 2 veces gira-izquierda; (*media-vuelta*)
avanza; (*avanzo*)
mientras algun-zumbador-en-la-mochila hacer deja-zumbador; (*dejo todos los zumbadores*)

Esa es la forma más sencilla, sin embargo si les digo que deben dejar los zumbadores donde
estaban, es decir:

Karel esta originalmente orientado al sur en (1,1) y tiene infinitos zumbadores en la mochila,
debes colocar en (1,4) la suma de la cantidad de zumbadores en (1,2) más (1,3) dejando los
sumandos donde están al finalizar la ejecución.

Hay otras miles de maneras de hacerlo, se podría hacer una función que copie los valores
arriba, y después los baje etc.

Pero hoy les voy a enseñar recursividad y paso de variables.

Les pondré el código completo, pero lo voy a explicar más abajo.

1
By Fantasía
Código:
iniciar-programa

define-nueva-instruccion suma(s) como inicio


si junto-a-zumbador entonces inicio
coge-zumbador;
suma(sucede(s));
deja-zumbador;
fin sino inicio
repetir 2 veces gira-izquierda;
mientras frente-libre hacer avanza;
repetir 2 veces gira-izquierda;
repetir 3 veces avanza;
repetir s veces deja-zumbador;
repetir 2 veces gira-izquierda;
mientras junto-a-zumbador hacer avanza;
repetir 2 veces gira-izquierda;
fin;
fin;

inicia-ejecucion
mientras no-orientado-al-este hacer gira-izquierda;
avanza;
suma(0);
avanza;
suma(0);
apagate;
termina-ejecucion
finalizar-programa

Antes de explicar el código necesito explicar cómo funciona la recursividad de funciones.


Miren:

Citar
define-nueva-instruccion [nombre] como inicio
si [condición de salida inversa] entonces
acciones a ejecutar
[llamada a la misma función]
acciones a ejecutar después al final, la cantidad de veces que la función fue llamada
fin;
fin;

2
By Fantasía
Es decir, en este ejemplo:

Código:
define-nueva-instruccion karel como inicio
si junto-a-zumbador entonces inicio
coge-zumbador;
avanza;
deja-zumbador;
gira-izquierda;gira-izquierda;
avanza;
gira-izquierda;gira-izquierda;
karel;
deja-zumbador;
fin;
fin;

Se copia el número de zumbadores en el espacio de adelante.


Veamos porque…

Código:
define-nueva-instruccion karel como inicio
creamos la función.

Código:
si junto-a-zumbador entonces inicio
Esta es nuestra condición de salida, es decir la recursividad (llamada a una función dentro de
su misma) solo se ejecuta mientras esta condición sea verdadera.

Código:
coge-zumbador;
avanza;
deja-zumbador;
gira-izquierda; gira-izquierda;
avanza;
gira-izquierda; gira-izquierda;
Esto es la sección donde coge el zumbador, lo deja adelante, y regresa a la posición original.

Código:
karel;
Aquí esta la llamada a sí misma.

3
By Fantasía
Código:
deja-zumbador;
Y esto es lo que va a hacer por cada zumbador que tomo, es decir dejar otro en su lugar.

En otras palabras, lo que hace es:

Código:
si hay zumbadores
agarro uno
lo pongo adelante
de nuevo lo mismo X veces
dejo X zumbadores.
Fin
fin;

Para los que aun no entienden, por ejemplo si hay 2 zumbadores el código que ejecuta el
programa realmente es este (sustituyo la llamada a karel por el código del mismo).

Código:
define-nueva-instruccion karel como inicio
si junto-a-zumbador entonces inicio
coge-zumbador;
avanza;
deja-zumbador;
gira-izquierda;gira-izquierda;
avanza;
gira-izquierda;gira-izquierda;
si junto-a-zumbador entonces inicio (*ESTA ES LA MISMA FUNCION OTRA VEZ*)
coge-zumbador;
avanza;
deja-zumbador;
gira-izquierda;gira-izquierda;
avanza;
gira-izquierda;gira-izquierda;
si junto-a-zumbador entonces inicio
(*AQUI LA CONDICION YA NO SE CUMPLE*)
fin;
deja-zumbador;
fin; (*AQUI TERMINA*)
deja-zumbador;
fin;
fin;

En fin, les he explicado de 3 maneras distintas la teoría de recursividad.

4
By Fantasía
Si aun no entienden, haber si me entienden este otro ejemplo:

Citar
define-nueva-instruccion ve-arriba como inicio
si no-orientado-al-norte entonces inicio
gira-izquierda;
ve-arriba;
fin;
fin;

Este código girara a la izquierda hasta que este no se cumpla: "no-orientado-al-norte" es decir,
girará: "mientras no-orientado-al-norte".

Una vez que hayan entendido recursividad. Ya podrán entender mejor el código, solo me faltan
2 cosas por explicar.

La primera es que diablos es "sucede"

jeje la primera vez que yo vi esa instrucción no le encontraba sentido..

Bueno, aquí esta un ejemplo:

4= sucede(3);
3= sucede(2);

Si me entienden? sucede es igual al valor que tiene dentro de los paréntesis MAS 1.

Bueno, sucede tiene una función hermana, llamada precede.

4= precede(5);
3= precede(4);

Precede es igual al valor que tiene dentro de los paréntesis MENOS 1.

Una cosa más.

Las funciones de Karel pueden recibir parámetros, y almacenarlos en variables.

Parámetro = dato extra pasado a una función

Variable = letra o palabra que almacena un numero. (En karel solo se pueden almacenar
números)

En fin.

5
By Fantasía
Por ejemplo, si creamos una función así:

Código:
define-nueva-instruccion rec(x) como inicio
repetir x veces avanza;
fin;
al llamar:
Código:
rec(5);
Karel avanzara 5 posiciones, porque la X vale 5.

Ahora sí, ya sabes todo lo necesario para entender el primer código que les puse.

Código:
define-nueva-instruccion suma(s) como inicio
si junto-a-zumbador entonces inicio
coge-zumbador;
suma(sucede(s));
deja-zumbador;
fin sino inicio
repetir 2 veces gira-izquierda;
mientras frente-libre hacer avanza;
repetir 2 veces gira-izquierda;
repetir 3 veces avanza;
repetir s veces deja-zumbador;
repetir 2 veces gira-izquierda;
mientras junto-a-zumbador hacer avanza;
repetir 2 veces gira-izquierda;
fin;
fin;

Esa es la función, lo importante es que cuando mandamos llamar la función la mandamos


llamar así:

Código:
suma(0);

Es decir inicialmente vale 0.

Bueno, una cosa más respecto a esta función.

Si usas un sino, el código que este en la acción del "sino" se ejecutara una sola vez cuando por
primera vez no se cumpla la condición.

6
By Fantasía
Si no me entendieron, léanlo de nuevo:

Si usas un sino, el código que este en la acción del "sino" se ejecutara una sola vez cuando por
primera vez no se cumpla la condición.

Una vez más:

Si usas un sino, el código que este en la acción del "sino" se ejecutara una sola vez cuando por
primera vez no se cumpla la condición.

Relean ese enunciado cuantas veces crean necesario.

Ahora analicemos parte por parte el código de la suma.

Citar
define-nueva-instruccion suma(s) como inicio
Bueno, esa es la función.

Citar
si junto-a-zumbador entonces inicio
Esta es la condición de salida, cuando no se cumpla, se terminara de llamar a si misma.

Citar
coge-zumbador;
Eso es lo que va a hacer cada vez que coja un zumbador.

Citar
suma(sucede(s));
y aquí es donde se llama la función a sí misma, solo que esta vez avisa que S va a valer uno
más, de esta forma se va guardando en S la cantidad de zumbadores que había..

Citar
deja-zumbador;
Aquí repone los zumbadores que cogió.

Citar
fin sino inicio
Recuerdan la línea que deben leer muchas veces hasta entenderla?, si no entiendes que hace
esto aquí, léela de nuevo.

7
By Fantasía
Citar
repetir 2 veces gira-izquierda;
mientras frente-libre hacer avanza;
repetir 2 veces gira-izquierda;
repetir 3 veces avanza;
repetir s veces deja-zumbador;
repetir 2 veces gira-izquierda;
mientras junto-a-zumbador hacer avanza;
repetir 2 veces gira-izquierda;
Esto lo que hace es ir a la posición 3 dejar lo que valga "S" de zumbadores y regresar.
Y al final son 2 "fin;", uno para terminar el "si/sino" y otro para terminar la función.

Pues esto fue un ejemplo de recursividad con Karel, y pues ahora ya deberían saber cómo
funciona el 98% de Karel nos faltan 2 cosas, extremadamente fáciles, y ya es todo lo que te
puedo enseñar de Karel, una próxima sesión será de cómo resolver problemas que parecen
muy complicados de la manera más sencilla posible.

Las 2 cosas que nos faltan son:

Una vez que ya recibimos una variable en nuestra función, digamos que se llama "kora"
podemos hacer algunas cosas con ella.

Por ejemplo karel puede detectar si kora es igual a 0.

Por ejemplo si kora vale 4, entonces en esta instrucción:

Código:
si si-es-cero(kora) entonces inicio
apagate;
fin sino inicio
avanza;
fin;

karel avanzara, porque kora no es cero.

¿Difícil?

Ahora también tenemos una cosa más.

NO
Y
O

8
By Fantasía
Y y O se usan para unir 2 o más sentencias.

Y regresa Verdadero si se cumplen las 2 condiciones.

O regresa verdadero cuando se cumple alguna de las 2 condiciones.

Estas son para modificar las condiciones que vimos al principio del taller.

si-junto-a-zumbador
frente-libre
etc..

Por ejemplo podemos poner un "si" así:

Código:
si junto-a-zumbador y frente-libre entonces ...

o un "mientras" así:
Código:
mientras junto-a-zumbador o frente-bloqueado hacer ...

o un "si" que te servira para las funciones recursivas:


Código:
si no si-es-cero(precede(kora)) entonces ...

Recuerdan que la sintaxis de si es esta:

si [condicion] entonces [accion]

pues entonces la condicion es esta:

no si-es-cero(precede(kora))

es decir..

si kora-1 (precede(kora) = kora-1


es cero (si-es-cero(kora-1))

cuando kora valga 4 entonces

es cero (4-1) ?

9
By Fantasía
nos regresa FALSO.

Pero si recuerdan nuestra condición lleva un "no":


si no si-es-cero(precede(kora)) entonces ...

Este no lo que hace es cambiar las cosas.. es decir.

FALSO va a regresar verdadero y al revés, es decir..

En nuestro caso de prueba el "no" convierte el FALSO en VERDADERO.

¿Me entendieron?

no FALSO = Verdadero
no Verdadero = FALSO

En fin las posibilidades de Karel son ilimitadas.

Ahora, ya son aptos para hacer los ejercicios de Karel que tienen un nivel de dificultad mas
grande, solo necesitan práctica y creatividad.

Aquí pueden encontrar ejercicios, les prometo que con practica en Karel, van a poder entender
a la perfección puntadores en C, funciones recursivas, y no tendrán problemas con arboles
estructuras etc. ya que karel es una versión mas básica de eso.

Y además cuando lleguen a un lenguaje de alto nivel van a ver todo lo que les sirvió aprender a
programar con este robotito

Estén atentos!!

Saludos!!

10
By Fantasía

También podría gustarte