jueves, 29 de agosto de 2013

Sobre condicionales - Actuando en consecuencia

En esta entrada quiero tratar el tema de instrucciones condicionales. Las instrucciones condicionales a la larga son instrucciones que el programador decide si se ejecutan o no en ciertos casos del problema que se está atendiendo. Básicamente uno asigna unas acciones a cada caso posible que se quiera considerar.

Árbol de decisión


Una buena manera de aproximarse a reconocer los escenarios posibles de un problema es armar un árbol de decisión. Un árbol de decisión tiene como objetivo representar los casos y sub- casos asociados a un problema por medio de una gráfica; hay muchos formatos de caso de decisión que van desde los arboles de decisión binarios lógicos (preguntas de si y no), los arboles de decisión probabilísticos (que tienen probabilidades asociadas a los casos) y los arboles de decisión n-arios casuales (que vamos a utilizar en este escrito). Algunas definiciones

Un nodo de un árbol de decisión es un caso: Suena obvio ¿cierto?, pues NO lo es. Normalmente estamos tentados a escribir en los nodos cosas que no son casos del problema, sino consecuencias o soluciones al caso. También se suele etiquetar el caso con un número para distinguirlo.


.................
|               |
| Caso 1        |
|               |
|...............|

Un nodo puede tener un padre: 

Si un nodo tiene un padre, significa que el nodo es un sub-caso de su padre. Se puede afirmar que si el caso hijo se presenta es porque el caso de su padre también se presentó. La relación entre estos casos es un AND (sucedieron los dos).
 .................
 |               |
 | Caso 1        |
 |               |
 |...............|
         |
         |
         |
       \ | /
        \./
 .................
 |               |
 | Caso 1.1      |
 |               |
 |...............|


Un nodo puede tener un hermano: 

Si un nodo padre tiene dos o más nodos hijos (sub-casos), estos nodos hijos se consideran hermanos. En un árbol de decisión se consideran casos hermanos mutuamente excluyentes, o sea relacionados por un XOR (sucede uno o el otro, nunca más de uno). Dicho de otra manera, no pueden suceder estos dos casos al tiempo.

 .................
 |               |
 | Caso 1        |
 |               |
 |...............|
         |--._
         |    `-..
         |        ``-._
       \ | /           `-.._    .
        \./                 `-._|
 .................     ......::::.......
 |               |     |               |
 | Caso 1.1      |     | Caso 1.2      |
 |               |     |               |
 |...............|     |...............|

El nodo raíz (que no tiene padre) se considera como el escenario general de todo el problema.

¿Para qué sirve esto?

Diversas situaciones requieren tener en cuenta todos los casos posibles, especialmente para poder tomar una determinación ante ellos. Los problemas que valen la pena, tienen un número de casos que no es manejable a menos que se tenga un modelo de representación y por eso es útil un árbol de decisión. A la hora de programarlo, se hace más importante aún, porque el arbol se reflejará en nuestra estructura de condicionales.

El condicional en JAVA - IF


La instrucción para la programación de condicionales en JAVA se llama IF y permite especificar la estructura de casos y las instrucciones a ejecutar en cada uno de ellos. La primera forma estructural del if es similar a lo siguiente:

if (condicion_caso)
{
   //instrucciones
   operacion();
}

El paréntesis encierra una expresión que evalúa un valor booleano (true si el caso se da, false si no). Luego va un agrupador (corchetes) con las instrucciones que se ejecutarán en ese caso. El funcionamiento es simple, si la condición se da, se llama al método operacion; en caso contrario no sucede nada.

La siguiente forma estructural utiliza la cláusula ELSE

if(condicion_caso)
{
    operacion1();
}
else
{
    operacion2();
}

En este caso, de darse la condición se llamará al método "operacion1", en caso contrario (si la condición no se cumple) se invocará el método "operación2". La cláusula ELSE funciona en este caso como decir "todos los otros casos" Esto se asemeja a un arbol de decisión así:

    .................
    |               |
    | Problema      |
    |               |
    |...............|
            |--._
            |    `-..
            |        ``-._
          \ | /           `-.._    .
           \./                 `-._|
    .................     ......::::.......
    |               |     |               |
    | Caso 1        |     | En cualquier  |
    |               |     | otro caso     |
    |...............|     |...............|



A una claúsula else se le puede adicionar también un if, de modo que se pueden especificar varios casos hermanos de manera puntual. Por ejemplo:

if(caso1)
{
    operacion1();
}
else if(caso2)
{
    operacion2();
}
else if(caso3)
{
    operacion3();
}
else
{
    operacion4();
}


Aquí se especifican cuatro casos diferentes y una operación diferente para cada uno de ellos. También se puede usar el else con esta estructura, haciendo que si ninguno de los casos se da (los casos 1,2 y 3) entonces se ejecutará la operación 4. Esto se asemeja a un árbol de decisión como este:

     .................
     |               |
     | Problema      |
     |               |
     |...............|
           /`-.._
          /   \ `:--.._
         /     `.  `-..``-.._
        /        \     `-._  `'--.__
       '          `.       `-._     `--.._
  +-------+    +-------+  +----`--+  +----'--+
  |       |    |       |  |       |  |       |
  | Caso1 |    | Caso2 |  | Caso3 |  | Otros |
  |       |    |       |  |       |  |       |
  +-------+    +-------+  +-------+  +-------+


Sin embargo, el if es una estructura jerárquica del lenguaje, por ello es posible que dentro de la operación de cada uno de los casos se ponga otra estructura if (anidar un if dentro de otro). El equivalente a esta operación es crear hijos en los arboles de decisión. Por ejemplo:

if(caso1)
{
    if(caso11)
    {
        operacion11();
    }
    else if(caso12)
    {
        operacion12();
    }
}
else if(caso2)
{
    if(caso21)
    {
        operacion21();
    }
    else
    {
        operacion22();
    }
}
else if(caso3)
{
    if(caso31)
    {
        if(caso311)
        {
            operacion311();
        }
        else if (caso312)
        {
            operacion312();
        }
    }
    else if(caso32)
    {
        operacion12();
    }
}
else
{
    operacion4();
}

Nótese que en esta estructura if hay varios casos anidados unos dentro de otros. El anterior ejemplo sería similar a evaluar un árbol de decisión similar al siguiente:

     .................
     |               |
     | Problema      |
     |               |
     |......`........|
          .'   `-:`---..___
         /        `-.   ``-`:-==...__
        /            `-.        ``-..ii`--...__
      .'                `-.            ``--.._ ```--...__
     /                     `-.                ``--..__   ```--...__
  +-------+                 +-`-.---+             +---``--+   +----'--+
  |       |                 |       |             |       |   |       |
  | Caso1 |                 | Caso2 |             | Caso3 |   | Otros |
  |       |                 |       |             |       |   |       |
  +---+`-._                 +---+`.-+             +--.'`.-+   +-------+
       |   `-.                .'   `-.              /    `.
  +----+--+ +-`-.=--+    +---+---+ +--`.---+  +---.'--+ +--`.---+
  |       | |       |    |       | |       |  |       | |       |
  | Caso11| | Caso12|    | Caso21| | Otros |  | Caso31| | Caso32|
  |       | |       |    |       | |       |  |       | |       |
  +-------+ +-------+    +-------+ +-------+  +---\---+ +-------+
                                                .' `.
                                               /     \
                                         +----+--+ +--`.---+
                                         |       | |       |
                                         |Caso311| |Caso312|
                                         |       | |       |
                                         +-------+ +-------+

Espero que este post les sea de utilidad!

No hay comentarios:

Publicar un comentario