Ver Mensaje Individual
  #79 (permalink)  
Antiguo 03/12/2014, 18:30
kutcher
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 10 años
Puntos: 13
Respuesta: Petando la pila. Problemas y retos usando recursividad.

Cita:
Iniciado por Pantaláimon Ver Mensaje
No sabía que el return se podía elidir sin que el compilador se queje. la rama del if no devuelve ningún valor pero funciona! ¿Alguna referencia al respecto? Estoy buscando ellipsis return C pero no encuentro nada.

Edit: veo que si compilo en gcc con la etiqueta -Wall me salen warnings en el código. De todas maneras me pregunto si esto tiene un comportamiento válido en C o depende del compilador.
En realidad eso en C tiene un comportamiento indefinido ¿Por que funciona? funciona en la mayoría de los casos porque cant almacena su valor de retorno en la posición utilizada para devolver valores (el registro AX en la CPU) debido a esto en la llamada a la función se encuentra un valor de retorno. Aunque la función no devuelve explícitamente un valor.

Sin embargo, esto se debe evitar no sé en que estaba pensando al hacerlo xD pues ahora quisiera rectificarme:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define MAX(a,b) ((a)>(b)?(a):(b))
  4. #define MIN(a,b) ((a)<(b)?(a):(b))
  5.  
  6. int dec[5] = { 1, 10, 100, 1000, 10000 };
  7. int cant(int num, int t)
  8. {
  9.     if (!num) return t;
  10.     t +=  1 << (num % 10) * 6;
  11.     return cant(num / 10, t);
  12. }
  13. int comprobar(int min, int max, int num, int b, int t, int es)
  14. {
  15.     if(min > max) return es > 0 ? 1 : 0;
  16.     b = num / min;
  17.     if (min * b == num && ((min % 10) || (b%10)) && t == cant(min, 0) + cant(b, 0))
  18.         printf("%d = %d x %d\n", num, min, b), es++;
  19.     return comprobar(min + 1, max, num, b, t, es);
  20. }
  21. int es_vampiro(int num)
  22. {
  23.     int min, max, b = 0, nd = log10(num) + 1, t = cant(num, 0);
  24.     if (nd % 2) return 0;
  25.     nd /= 2;
  26.     min = MAX(dec[nd - 1], (num + dec[nd] - 2)/(dec[nd] - 1));
  27.     max = MIN(num/min, sqrt(num));
  28.     return comprobar(min, max, num, b, t, 0);
  29. }
  30. int main(void)
  31. {
  32.     printf("\n<%d>\n", es_vampiro(13078260));
  33.     return(0);
  34. }

Saludos

Última edición por kutcher; 03/12/2014 a las 19:23