Miércoles 26 de Mayo

Definición de funciones

Objetivos: Mostrar cómo se puede extender el lenguaje Java con nuevas funciones.

Temas:


Motivación

Escribir un programa que determine la cantidad de combinaciones que se pueden realizar tomando k elementos distintos de un grupo de n elementos. El número de combinaciones está dado por la siguiente fórmula:

    | n |      n!
    |   | = ---------
    | k |   k! (n-k)!
Solución:

Calcular el factorial de un número es simple, pero escribir 3 veces el mismo código para calcular el factorial de distintos números es incómodo. Por otra parte, se triplica la probabilidad de cometer algún error.

Definición de funciones

En clases anteriores vimos que Java posee funciones predefinidas para calcular el seno, la raíz cuadrada, el logaritmo y otras funciones científicas. El problema es que es imposible que un lenguaje de programación suministre todas las funciones que un programador podría necesitar.

Por esta razón, prácticamente todos los lenguajes incorporan algún mecanismo para que los programadores puedan definir sus propias funciones cuando no existe la función predefinida apropiada. Para definir una nueva función, el programador debe escribir el código (programa) que calcula esa función.

Por ejemplo, el siguiente programa calcula el número de combinaciones:

    class Combinaciones extends Program {
      void run() {
        print("Ingrese k ? ");
        int k= readInt();
        print("Ingrese n ? ");
        int n= readInt();
        int combinaciones= fact(n)/(fact(k)*fact(n-k));
        println("Combinaciones= "+combinaciones);
      }
      // Definición de la funcion fact
      int fact(int x) {
        // fact recibe un argumento entero y entrega un resultado entero.
        // El siguiente código calcula el factorial de x
        int prod= 1;
        int i= 1;
        while (i<=x) {
          prod= prod*i;
          i= i+1;
        }
        // Indica qué valor entrega esta función.
        return prod;
      }
    }
El siguiente patrón de programación se usa para definir varias funciones que pueden ser usadas en un programa:

    class ... extends Program {
      void run() {
        ...
      }
      tipo nombre-función ( parámetros ) {
        ... programa que calcula esta función ...
        return expresión;
      }
      ... Más funciones ...
    }
Explicación:


Invocación de una función

La forma general de una invocación de una función es:

    nombre-función ( argumentos )
en donde argumentos son 0, 1, 2 o más expresiones separadas por coma. Por ejemplo:

    fact(n-k)
La semántica de una invocación de función es la siguiente:

Esto se puede apreciar en la siguiente figura que muestra las 3 invocaciones de la función fact a partir de run() cuando n es 7 y k es 2:

En cada invocación el argumento es distinto y por tanto el valor entregado por la función.


Ejemplo:

Definir la función repite(s,n) que entrega el string s concatenado con sí mismo n veces. Es decir, se desea que repite("hola",3) entregue (o retorne) como resultado el string "holaholahola".

    class Triangulo extends Program {
      String repite(String s, int n) {
        String r= "";
        int i= 1;
        while (i<=n) {
          r= r+s;
          i= i+1;
        }
        return r;
      }
      void run() {
        int i=1;
        while (i<=8) {
          println(repite("*",i));
          i= i+1;
        }
      }
    }
El programa anterior produce la siguiente salida:

    *
    **
    ***
    ****
    *****
    ******
    *******
    ********

Tarea: