def recur(a): 
  if( (a/2)!=0): 
    return recur(a/2) * 10+a%2
  else: 
      return 1
c=recur(10)
print(c)

Inf se imprime cuando estoy ejecutando este código. ¿Alguien puede explicar mis fallas y este código? (Convertí este código de C a Python; el código original se da a continuación)

#include <stdio.h>
int recur(int n)
{
    if((n/2)!=0)
     return (recur(n/2)*10+n%2);
    
    else
      return 1;
}
int main()
{ int d;
d=recur(10);
    printf("%d",d);

    return 0;
}

salida 1010

1
T De 22 jun. 2020 a las 21:32

2 respuestas

La mejor respuesta

El operador de división / en Python 3 es una división de coma flotante, por lo que su ciclo se ejecutará para siempre. reemplazar por // y ser feliz.

7
Igor Rivin 22 jun. 2020 a las 18:35

Respondiendo una pregunta en los comentarios, así es como obtienes 1010 como resultado.
Vamos a rastrear la ejecución de recur:

recur( 10 )
  return recur( 5 ) * 10 + 10 % 2 ---------+
    return recur( 2 ) * 10 + 5 % 2 ------+ |
      return recur( 1 ) * 10 + 2 % 2 --+ | |
        return 1                       | | |
      1 * 10 + 2 % 2 == 10 + 0 == 10 <-+ | |
    10 * 10 + 5 % 2 == 100 + 1 == 101 <--+ |
  101 * 10 + 10 % 2 == 1010 + 0 == 1010 <--+

CÓMO, para calcular el resultado de recur(10), calculamos el resultado de recur(10/2), o recur(5), multiplicamos eso por 10 y sumamos el resultado de 10 % 2 (0).

Para calcular el resultado de recur(5), calculamos el resultado de recur(5/2) o recur(2), multiplicamos eso por 10 y sumamos el resultado de 5 % 2 ({ {X5}}).

Para calcular el resultado de recur(2), calculamos el resultado de recur(2/2) o recur(1), multiplicamos eso por 10 y sumamos el resultado de 2 % 2 ({ {X5}}).

1/2 == 0, por lo que el resultado de recur(1) es 1. 1 * 10 + 2 % 2 es 10, por lo que el resultado de recur(2) es 10. 10 * 10 + 5 % 2 es 101, por lo que el resultado de recur(5) es 101. Y finalmente, el resultado de 101 * 10 + 10 % 2 es 1010, así que ese es el resultado de recur(10).

En C, la división entera produce un resultado entero, entonces 1/2 == 0, 5/2 == 2, etc.

0
John Bode 22 jun. 2020 a las 21:43