Fundamentos de Programación
Aplicar funciones, procedimientos y recursividad
Semestre II HT-04 1/1
N° OPERACIONES MATERIALES/INSTRUMENTOS
01 Aplicar declaración de procedimientos ▪ Computadora/Laptop de
02 Aplicar declaración de funciones laboratorio
▪ Proyector Multimedia
03 Aplicar recursividad ▪ Televisor LED
04 ▪ DFD
05 ▪ PseInt
06
07
08
PROCEDIMIENTOS Y FUNCIONES
SUBPROCESO
Un subproceso es un subprograma, procedimiento o función que realiza una tarea específica y que puede ser definido
mediante 0 , 1 o más parámetros. Tanto en entrada de información al subproceso como la devolución de resultados desde
la subrutina se realiza mediante parámetros, el cual nos sirve para introducir o modificar información del programa principal.
Sintaxis
SubProceso NombreSubProceso
// ...hacer algo con los argumentos
FinSubProceso
Los subprocesos pueden o no tener valores de retorno.
En general, un problema complejo puede resolverse de manera eficiente si se divide en procesos pequeños. Esto implica
que el problema original será resuelto por medio de varios módulos, cada uno de los cuales se encargará de solucionar
alguna parte determinada. Esos módulos se conocen con el nombre de subprocesos o subalgoritmos, es decir, algoritmos
cuya función es resolver un subproblema.
Los subalgoritmos se escriben solo una vez y, luego, podemos hacer referencia a ellos desde diferentes puntos de un
pseudocódigo. De esta forma, podemos reutilizar el código y evitar la duplicación de procesos.
Es importante tener en cuenta que los subalgoritmos son independientes entre sí; esto quiere decir que se pueden escribir
y verificar en forma separada. Por eso, será más fácil localizar un error en la codificación que estamos creando y, también,
modificarlo, sin tener que rehacer varias partes de él.
Existen dos clases de subalgoritmos: funciones y procedimientos, que también encontraremos con los nombres de
subrutinas o subprogramas.
NOTA: El saber cuándo usar una función y cuándo un procedimiento es uno de los dilemas más frecuentes entre los
principiantes en programación. Nos referimos a las funciones y procedimientos definidos por el usuario.
ÁMBITO DE LAS VARIABLES
En programación, existen dos tipos de variables, las locales y las globales. Las primeras son aquellas que se encuentran
dentro de un subprograma, ya sea un procedimiento o una función, y son distintas de las que están en el algoritmo principal.
El valor se confina al subprograma en el que está declarada. En cambio, las globales son las que se definen o están declaradas
en el algoritmo principal, y tienen efecto tanto en él como en cualquiera de sus subprogramas.
Los subalgoritmos pueden recibir valores del algoritmo principal, llamados parámetros, trabajar con ellos y devolverle un
resultado. También pueden llamar a otros o a sus propios subprogramas; incluso, puede llamarse a sí mismo, lo que se conoce
como recursividad.
1. PROCEDIMIENTOS
Los procedimientos son básicamente un conjunto de instrucciones que se ejecutan sin retornar ningún valor, hay quienes
dicen que un procedimiento no recibe valores o argumentos, sin embargo, en la definición no hay nada que se lo impida.
Un procedimiento es un subprograma o un subalgoritmo que ejecuta una determinada tarea, pero que tras ejecutar esa
tarea no tienen ningún valor asociado a su nombre como en las funciones, sino que si devuelve información, lo hace a través
de parámetros.
Al llamar a un procedimiento, se le cede el control, comienza a ejecutarse y cuando termina devuelve el control a la siguiente
instrucción a la de llamada.
Una función puede retornar más de un valor si ella usa parámetros por referencia. En
este texto los parámetros por referencia sólo se usarán en los procedimientos ya que,
es una muy mala técnica de programación el uso de parámetros por referencia en
funciones. Esta consideración se hace pues, desde el punto de vista matemático, una
función no puede modificar los valores de los parámetros.
2. FUNCIONES
Desde el punto de vista matemático, una función es una expresión que toma uno o más valores llamados argumentos y
produce un resultado único. Algunos ejemplos de funciones matemáticas son: los logaritmos y las funciones trigonométricas
(seno, coseno, etc.).
En el ambiente de la programación de algoritmos, las funciones tienen exactamente el mismo significado. Se realizan ciertos
cálculos con una o más variables de entrada, y se produce un único resultado, que podrá ser un valor numérico, alfanumérico
o lógico. Es decir, una función puede devolver como resultado una cadena, un número o un valor de tipo lógico. Esto hace
que en los lenguajes de programación debamos especificar el tipo de la función.
La función será de tipo numérica cuando devuelva un número, y será alfanumérica cuando devuelva una cadena. En el
caso de las funciones numéricas, existen subdivisiones que están dadas por los tipos de datos soportados por algún lenguaje.
EJEMPLO 01: Ejemplo de la función matemática sen(x). En este caso, la función se llama sen (seno), y el argumento o valor
que se le pasa para que lo procese es x. Así, sen(90º)=1. Este valor, como es único, se denomina función; es decir, no existe
ningún otro número que la
función pueda procesar y devolver 1, más que 90º.
Cuando utilicemos esta función en un pseudocódigo y necesitemos el valor del sen(90º), debemos asignarlo de la siguiente
forma:
Aquí, como la variable valor es 1 (0.8939966636), nuestra función es numérica. Es así como se llama a las funciones desde
un pseudocódigo, asignándolas siempre a una variable que contendrá el valor devuelto por la función. Si no hacemos esta
asignación, la función no podrá ejecutarse, porque no tendrá un espacio o lugar donde descargar el resultado. Por lo tanto,
la llamada a una función tendrá la siguiente sintaxis:
variable <- funcion (parámetros)
EJEMPLO 02: si a la función MES, que devuelve el nombre del mes, le pasamos el valor numérico correspondiente, el
resultado será:
La función es de tipo texto, porque devuelve una cadena como resultado en la variable nombre_mes.
1.1. ESCRIBIR FUNCIONES O PROCEDIMIENTOS
Las funciones y los procedimientos no se escriben en el algoritmo principal, ya que, en programación, existen
espacios destinados a ellos. Todas las funciones y los procedimientos que utilicen un algoritmo podrán escribirse
antes o después del algoritmo principal.
Una función se identifica por su nombre, como cuando escribimos un algoritmo utilizando inicio y fin para indicar
dónde comienza y dónde termina. A continuación, veamos cómo sería la sintaxis:
Declaración de la función o
procedimiento
En los lenguajes de programación estructurada hay dos formas de pasar variables a una función:
✓ por referencia, o
✓ por valor
Cuando la variable se pasa por referencia, la función puede acceder a la variable original. Este enfoque es habitual
en lenguajes como el Pascal. En C, sin embargo, todos los parámetros se pasan por valor. La función recibe una
copia de los parámetros y variables, y no puede acceder a las variables originales. Cualquier modificación que
efectuemos sobre un parámetro no se refleja en la variable original. Esto hace que no podamos alterar el valor de
la variable por equivocación.
Sin embargo, en determinadas ocasiones necesitaremos alterar el valor de la variable que le pasamos a una
función. Para ello en el C se emplea el mecanismo de los punteros.
Ejem 03:
1. Ingresar el nombre de un usuario y mostrarlo por pantalla, realizarlo por función y por procedimiento:
5. Variar el ejercicio anterior subrayando cualquier longitud de texto ingresado por el usuario.
7. Implementación del cálculo de una potencia mediante una función recursiva. El paso recursivo se basa en
que A^B = B*(A^(B-1)), El paso base se base en que A^0 = 1
Algoritmo sin_titulo
AREA <- ingresar();
ver(AREA);
Escribir "Presione una tecla";
Leer tecl;
Mientras tecl == "B" hacer
Limpiar Pantalla
AREA <- ingresar();
ver(AREA);
Escribir "Presione una tecla";
Leer tecl;
FinMientras
Escribir "Terminò el programa";
FinAlgoritmo
////////////////////////////////////////////////////
Funcion A_Tri <- ingresar()
Escribir "Ingresa la base" Sin Saltar;
Leer Base;
Escribir "Ingresa la altura" Sin Saltar;
Leer Altura;
A_Tri <- calcular(Base, Altura);
FinFuncion
Funcion ver(AR)
Escribir "El area es ", AR;
FinFuncion
11. Elaborar una la función que toma dos números, los compara y nos dice cuál es mayor.
12. Calcula los N primeros números primos
3. RECURSIVIDAD
Se dice que un subprograma es recursivo cuando se llama a sí mismo. La recursividad se va a poder usar en subprogramas
que pueden definirse en términos recursivos, es decir, en termino de sí mismo, como procesos de alguna manera repetitivos.
La recursividad trataremos de evitarla siempre que sea posible, es decir, siempre que lo mismo se pueda solucionar con un
bucle, ya que cada vez que un subprograma se llama a sí mismo hay que almacenar en la pila del sistema la dirección de
retorno de ese subprograma, con lo cual si hacemos muchas llamadas recursivamente iremos llenando la pila del sistema, y
se desbordara acabando con la memoria.
Todo programa recursivo tiene que tener alguna condición que ponga fin a la recursividad, es decir, que el programa deje de
llamarse a sí mismo cuando se cumpla la condición, sino se formaría un bucle infinito.
1.3. Ventajas:
✓ Se escribe poco código.
✓ resuelve problemas recurrentes.
1.4. Desventajas:
✓ Creación y uso de muchas variables, lo que consume tiempo.
✓ Requiere memoria adicional, para cada llamada de la función o método de si misma.
1.5. Requerimientos y Rendimiento:
✓ Llamarse a si misma dentro de su código.
✓ Retornar un valor.
✓ Especificar un caso base, es cuando debe de terminar llamarse a si mismo e iniciar el retorno de los valores
generados en cada llamada.
✓ Hacer un análisis comparativo de uso de memoria y velocidad para saber si aplicar recursividad o su
equivalente iterativo en caso de haberlo.
El factorial de 7 es
7!=7·6·5·4·3·2·1
Y en general el factorial cualquier número es
n! = n · (n-1) · (n-2) · (n-3) · ... · 2 · 1
Si comparas con el factorial de 6, verás que se parece
mucho al de 7:
6!=6·5·4·3·2·1
De modo que podrías escribir el factorial de 7 a partir del
factorial de 6:
7!=7·6!
Sólo falta pensar cual es el "caso base", la solución más
sencilla posible para este problema. En el caso del
factorial, se trata del factorial de 0, que tiene como valor
1:
0!=1
Esa es la idea que hay que aplicar. Así, una función
"Factorial" recursiva en PseInt podría ser así: