He estado experimentando con Python como un begninner en las últimas horas. Escribí una función recursiva, que devuelve recurse (x) como x! en Python y en Java, para comparar los dos. Los dos pedazos de código son idénticos, pero por alguna razón, el de Python funciona, mientras que el de Java no. En Python, escribí:¿Por qué estos dos pedazos de código similares producen resultados diferentes?
x = int(raw_input("Enter: "))
def recurse(num):
if num != 0:
num = num * recurse(num-1)
else:
return 1
return num
print recurse(x)
Donde la variable num se multiplica por num-1 hasta llegar a 0, y muestra el resultado. En Java, el código es muy similar, sólo que más largo:
public class Default {
static Scanner input = new Scanner(System.in);
public static void main(String[] args){
System.out.print("Enter: ");
int x = input.nextInt();
System.out.print(recurse(x));
}
public static int recurse(int num){
if(num != 0){
num = num * recurse(num - 1);
} else {
return 1;
}
return num;
}
}
Si entro en el 25, el Código Python vuelve 1.5511x10E25, que es la respuesta correcta, pero el código de Java vuelve 2076180480, el cual no es la respuesta correcta, y no estoy seguro de por qué.
Ambos códigos van sobre el mismo proceso:
- Comprobar si num es cero
- Si num no es cero
- num = num multiplicado por la recursividad de num - 1
- Si num es cero
- Devuelve 1, terminando esa pila de llamadas recurrentes, y c ausing cada num vuelto a comenzar a multiplicarse
- retorno num
No hay paréntesis en pitón; Pensé que de alguna manera había cambiado las cosas, así que quité los corchetes del código de Java, pero no cambió. Cambiar el booleano (num! = 0) a (num> 0) tampoco cambió nada. Agregar una instrucción if al else proporcionó más contexto, pero el valor seguía siendo el mismo.
Impresión de los valores de num en cada punto da una idea de cómo la función va mal:
Python:
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
51090942171709440000
1124000727777607680000
25852016738884976640000
620448401733239439360000
15511210043330985984000000
15511210043330985984000000
Un aumento constante. En Java:
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
1932053504
1278945280
2004310016
2004189184
-288522240
-898433024
109641728
-2102132736
-1195114496
-522715136
862453760
-775946240
2076180480
2076180480
No se produce un aumento constante. De hecho, num devuelve números negativos, como si la función devolviera números negativos, aunque num no debería estar por debajo de cero.
Tanto los códigos de Python como los de Java están siguiendo el mismo procedimiento, sin embargo, están devolviendo valores muy diferentes. ¿Por qué está pasando esto?
Desbordamiento de enteros ... – Mysticial
Python promueve de int a long automáticamente mientras java no. – jamylak
Esta es una gran pregunta, ya que es algo en que todos los que responden preguntas de inmediato comprenden el problema, pero es algo que no puedes buscar a menos que ya sepas cómo se llama el problema. –