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