Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/11/2014, 12:31
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años
Puntos: 32
Petando la pila. Problemas y retos usando recursividad.

Buenas.

Dado que veo que el tema de recursividad está gustando bastante propongo crear este hilo donde iré proponiendo diferentes retos a resolver en C sin usar iteración (bucles for, while, do while) ni goto, claro. Se pueden usar tantas funciones como se quieran.

De momento iré sacando los problemas de un pdf que tengo de ejercicios en Haskell y los iré adaptando a C. Pues venga, ¡Vamos al grano y presento los dos primeros retos!

1) Escriba una función contarNegativos que cuente cuantos números negativos existen en una lista
Ejemplo: dado el array {1, 4, -3, 2, -1, -8, 0, 1} debe devolver 3:

Aquí el código de plantilla:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. /* más codigo si hace falta */
  4.  
  5. int contarNegativos(int arr[], int n) {
  6.     /* Escribir código */
  7.     return 0;
  8. }
  9.    
  10. int main (void) {
  11.     int arr[] = {1, 4, -3, 2, -1, -8, 0, 1};
  12.     int n = sizeof arr / sizeof *arr;
  13.  
  14.     /* calcular cantidad de negativos */
  15.     int cantidad = contarNegativos(arr, n);
  16.     /* mostrar cantidad de negativos */
  17.     printf("%d\n", cantidad);
  18.     return 0;
  19. }

2) Escriba una función diag que tenga una lista de caracteres como parámetro y que dé como resultado los caracteres
en una diagonal.
Cadena:
Código C:
Ver original
  1. "abcde"
Resultado:
Código C:
Ver original
  1. a
  2.  b
  3.   c
  4.    d
  5.     e
Aquí el código de plantilla:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. /* más codigo si hace falta */
  6.  
  7. char* diag(char* cadena, char* resultado) {
  8.     /* Escribir código */
  9.     resultado[0] = '\0';
  10.     return resultado;
  11. }
  12.  
  13. int main (void) {
  14.     char cadena [] = "abcde";
  15.     int n = strlen(cadena);
  16.  
  17.     char* resultado = malloc(n * n + 1); /* doy mas espacio del necesario */
  18.  
  19.     // a partir de la cadena de caracteres retornar la nueva que tenga los caracteres en diagonal
  20.     resultado = diag(cadena, resultado);
  21.  
  22.     //mostrar resultado
  23.     puts(resultado);
  24.  
  25.     free(resultado);
  26.     return 0;
  27. }

Ya se irá complicando la cosa

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils