Ver Mensaje Individual
  #34 (permalink)  
Antiguo 22/11/2014, 20:03
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Petando la pila. Problemas y retos usando recursividad.

Hola,

Al parecer ya van mas adelantados, aún así me uno con las dos propuestas iniciales, seguramente no están optimizadas, son solamente otro punto de vista de los problemas.

Esta ya estaba resuelta anteriormente casi de igual forma, el concepto creo que es el mismo en todos los casos,

Problema #1:

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

Para esta use un concepto un poco diferente, los programadores que tiene tiempo en esto seguramente van a observar un patrón bastante antiguo basado en los segmentos de la memoria, antiguamente no existía la memoria flat como ahora, así que había que trabajar con segmentos y offsets. Es solamente otro punto de vista el problema.

El único cambio a la plantilla original es en el tamaño reservado, que para contener el resultado realmente debía ser mas grande.

Problema #2:

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. #define SEG(ds, ws) (ds * (ws + 1))
  8.  
  9. char* diacpy(char* dst, const char* src, const int ws, const int ds, const int bx) {
  10.     if (bx >= ws) {
  11.         dst[SEG(ds, ws)] = '\0';
  12.     } else {
  13.         memset(&dst[SEG(ds, ws)], 0x20, ws);
  14.         memcpy(&dst[SEG(ds, ws) + bx], &src[bx], 1);
  15.         dst[SEG(ds, ws) + ws] = 0x0a;
  16.         diacpy(dst, src, ws, ds + 1, bx + 1);
  17.     }
  18.     return dst;
  19. }
  20.  
  21. char* diag(char* cadena, char* resultado) {
  22.     /* Escribir código */
  23.     return diacpy(resultado, cadena, strlen(cadena), 0, 0);
  24. }
  25.  
  26. int main (void) {
  27.     char cadena [] = "abcde";
  28.     int n = strlen(cadena);
  29.  
  30.     char* resultado = malloc((n + 1) * n + 1); /* doy mas espacio del necesario */
  31.  
  32.     // a partir de la cadena de caracteres retornar la nueva que tenga los caracteres en diagonal
  33.     resultado = diag(cadena, resultado);
  34.  
  35.     //mostrar resultado
  36.     puts(resultado);
  37.  
  38.     free(resultado);
  39.     return 0;
  40. }

En sí, no hay nada optimizado ni especializado y posiblemente tenga algún error. Con un poco mas de tiempo voy a pensar en alguna propuesta para los siguientes problemas.

Saludos,