Sección 15 - Instituto de Matemáticas

Anuncio
Introducción
Paso de parámetros
Recursividad
Introducción a los Computadores
Funciones y recursividad en C
Alejandro Piedrahita H.
Instituto de Matemáticas
Facultad de Ciencias Exactas y Naturales
Universidad de Antioquia
Copyleft «2013. Reproducción permitida bajo los
términos de la licencia de documentación libre GNU.
Documento bajo construcción, reportar errores al
correo electrónico [email protected]
Referencias
Introducción
Paso de parámetros
Contenido
1
Introducción
2
Paso de parámetros
3
Recursividad
4
Referencias
Recursividad
Referencias
Introducción
Paso de parámetros
Recursividad
Estructura general de un función en C
tipo nombre funcion(tipo argumento1, tipo argumento2, ...) {
sentencias
}
tipo: tipo de dato devuelto por la función
nombre funcion: identificador o nombre de la función
tipo: tipo de dato de la variable argumento
sentencias: cuerpo de la función
Referencias
Introducción
Paso de parámetros
Recursividad
Ejemplo: la función main()
hola mundo2.c
#include<stdio.h>
int main(){
printf("Hola mundo de nuevo. \n");
return 0;
}
main: función principal, todo programa en C la debe incluir
int: tipo de dato (entero) devuelto por la función
Devuelve 0 si no hay errores
Devuelve 1 u otro valor nulo si hay errores
(): no tiene argumentos
Referencias
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo: función suma()
int suma(int a, int b) {
return a+b;
}
sumafun1.c
sumafun2.c
#include<stdio.h>
#include<stdio.h>
// definición de la función
int suma(int a, int b) {
return a+b;
}
// declaracion de la función
int suma(int a, int b);
main(){
int x, y;
main(){
int x, y;
printf("x = ");
scanf("%d", &x);
printf("x = ");
scanf("%d", &x);
printf("y = ");
scanf("%d", &y);
printf("y = ");
scanf("%d", &y);
printf("\nx + y = %d \n", suma(x,y));
}
printf("\nx + y = %d \n", suma(x,y));
}
// definición de la función
int suma(int a, int b) {
return a+b;
}
Introducción
Paso de parámetros
Recursividad
Estructura general de un programa en C
// archivos de cabecera de las librerı́as
#include<blablabla.h>
.
.
.
// declaración de funciones
tipo nombre funcion1(tipo argumento1, tipo argumento2, ...)
.
.
.
// función principal
tipo main(tipo argumento1, tipo argumento2, ...){
sentencias
}
// definición de la función
tipo nombre funcion1(tipo argumento1, tipo argumento2, ...) {
sentencias
}
.
.
.
Referencias
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo 1.1 (Valor absoluto)
Escriba una función en C que calcule el valor absoluto de un número real
x. Recuerde que dicha función ya está implementada en la librerı́a math.h
Solución
valor absoluto.c
#include<stdio.h>
// declaracion de la función factorial
double vabs(double a);
main(){
double x;
printf("Ingrese número = ");
scanf("%lf", &x);
printf("\nEl valor absoluto de %lg es %lg \n", n, vabs(x));
}
// definición de la función factorial
double vabs(double a) {
if (a>=0) return a;
else return -a;
}
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo 3.1: factorial
Ejemplo 1.2 (Factorial)
Dado un entero positivo n, escriba una función en C que calcule n!
Recuerde que el factorial de n está dado por
n! = 1 · 2 · · · (n − 1) · n ,
con
0! = 1
y
1! = 1
Solución
Variables y funciones:
n: variable de tipo entero, representa el entero al que se le va a calcular
el factorial
prod: variable de tipo entero que actuará de acumulador; almacena el
producto de los primeros n números naturales
1 * 2 * ··· * n
int fact(int n): función factorial
Introducción
Paso de parámetros
Recursividad
Ejemplo 3.1: factorial
factorialfun.c
#include<stdio.h>
// declaracion de la función factorial
int fact(int k);
main(){
int n;
printf("Ingrese entero = ");
scanf("%d", &n);
printf("\nEl factorial de %d es %d \n", n, fact(n));
}
// definición de la función factorial
int fact(int k) {
int i, prod=1;
for (i=1; i<=k; i++) prod *= i; // prod = prod*i
return prod;
}
Referencias
Introducción
Paso de parámetros
Recursividad
Referencias
Paso de parámetros a una función
Paso de parámetros por valor
Modo por defecto en C y C ++
Cuando main() hace un llamado a una función, se manda una copia del
valor de cada una de las variables de los argumentos de la función
Cualquier modificación que se realice dentro de la función sobre los
parámetros, no afecta las variables definidas en main()
Paso de parámetros por referencia
Modo sólo disponible en C ++
Se declara una lista de parámetros formales, un alias del objeto que se
pasa, de manera tal que el parámetro definido en la función y en main()
referencian la misma dirección de memoria.
La referencia se representa precediendo al parámetro del caracter &
Paso de parámetros por dirección
Modo disponible en C, paso de parámetros a través de punteros
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo 2.1 (Paso por valor)
Escriba una función en C que intercambie el contenido de dos variables.
Solución
porvalor.c
#include<stdio.h>
// declaracion de la función intercambia()
void intercambia(double a, double b);
main(){
double x = 2, y = 3;
printf("x = %lf e y = %lf \n", x, y);
intercambia(x, y);
printf("x = %lf e y = %lf \n", x, y);
}
// definición de la función intercambia()
void intercambia(double a, double b) {
double temp;
temp = a;
a = b;
b = temp;
}
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo 2.2 (Paso por dirección)
Escriba una función en C que intercambie el contenido de dos variables.
Solución
pordireccion.c
#include<stdio.h>
// declaracion de la función intercambia()
void intercambia(double *a, double *b);
main(){
double x = 2, y = 3;
printf("x = %lf e y = %lf \n", x, y);
intercambia(&x, &y);
printf("x = %lf e y = %lf \n", x, y);
}
// definición de la función intercambia()
void intercambia(double *a, double *b) {
double temp;
temp = *a;
*a = *b;
*b = temp;
}
Introducción
Paso de parámetros
Recursividad
Referencias
Funciones “recursivas”
Función recursiva: función que se llama a sı́ misma
La recursividad es una técnica poderosa que se utiliza en lugar de las
estructuras iterativas
Los programas recursivos en general son menos eficientes que los
iterativos
Muchos programas recursivos resultan ser más elegantes y simples que
los escritos de manera iterativa
Recursividad vs iteración:
Estructuras repetitivas (while, do-while, for): el proceso se ejecuta
por repetición del código que contiene, controlado por una condición
Programas recursivos: el proceso se realiza por repetición de llamadas
sucesivas a sı́ mismo, controlado por una sentencia de bifurcación
El consumo de recursos (pila) en cada llamada a una función es mayor
que en los programas iterativos
Introducción
Paso de parámetros
Recursividad
Referencias
Ejemplo 3.1: el maldito factorial de nuevo
Ejemplo 3.1 (Factorial recursivo)
Dado un entero positivo n, escriba una función recursiva en C llamada
fact que calcule n!. Recuerde que el factorial de un entero no negativo n se
define como
n! = 1 · 2 · · · (n − 1) · n ,
con
0! = 1
y
1! = 1
Observaciones
El factorial puede expresarse de manera recursiva:
n! = 1 · 2 · · · (n − 1) · n = (n − 1)! · n
⇐⇒
fact(n) = fact(n − 1) · n
Función factorial iterativa
Función factorial recursiva
int fact(int k) {
int fact(int k) {
int i, prod=1;
for (i=1; i<=k; i++) prod *= i;
return prod;
}
if (k==1) return 1;
else return fact(k-1)*k;
}
Introducción
Paso de parámetros
Recursividad
Ejemplo 3.1: factorial
factorialrecursivo.c
#include<stdio.h>
// declaracion de la función factorial
int fact(int k);
main(){
int n;
printf("Ingrese entero = ");
scanf("%d", &n);
printf("\nEl factorial de %d es %d \n", n, fact(n));
}
// definición de la función factorial
int fact(int k) {
if (k==1) return 1;
else return fact(k-1)*k;
}
Referencias
Introducción
Paso de parámetros
Recursividad
Bibliografı́a I
O. Cairó
Metodologı́a de la programación
Segunda edición. Alfaomega Grupo Editor, S.A., 2005
M.A. Criado
Programación en lenguajes estructurados
Alfaomega Grupo Editor, S.A. de C.V. Primera Edición, 2006
B.W. Kernighan, D. Ritchie
The C Programming Language
Prentice Hall, 2th Edition, 1988
S. Lipschutz
Schaum’s Outline of Essential Computer Mathematics
McGraw-Hill, 1th edition, 1982
H.M. Mora Escobar
Introducción a C y a métodos numéricos
Universidad Nacional de Colombia (Sede Bogotá), 2004
Referencias
Introducción
Paso de parámetros
Recursividad
Referencias
Bibliografı́a II
M.J. Páez
C y C ++ de afán
Universidad de Antioquia, 2004
R. Séroul
Programming for Mathematicians
Springer, 2000
E. Scheinerman
C ++ for Mathematicians: An Introduction for Students and
Professionals
Taylor & Francis Group, LLC, 2006
A. Shen
Algorithms and Programming
Springer Undergraduate Texts in Mathematics and Technology, 2010
P. Tymann
Schaum’s Outline of Principles of Computer Science
McGraw-Hill, 1th edition, 2008
Descargar