Ho sperimentato con Python come begninner nelle ultime ore. Ho scritto una funzione ricorsiva, che restituisce recurse (x) come x! in Python e in Java, per confrontare i due. I due pezzi di codice sono identici, ma per qualche ragione, il Python funziona, mentre quello Java no. In Python, ho scritto:Perché questi due pezzi di codice simili producono risultati diversi?
x = int(raw_input("Enter: "))
def recurse(num):
if num != 0:
num = num * recurse(num-1)
else:
return 1
return num
print recurse(x)
Dove variabile num si moltiplica per num-1 fino a raggiungere 0, ed emette il risultato. In Java, il codice è molto simile, solo più a lungo:
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;
}
}
Se entro il 25, il codice Python ritorna 1.5511x10E25, che è la risposta corretta, ma il codice Java ritorna 2.076.180,48 mila, che non è la risposta corretta, e non sono sicuro del perché.
Entrambi i codici vanno circa lo stesso processo:
- Controllare se num è pari a zero
- Se num non è zero
- num = num moltiplicato per la ricorsione di num - 1
- Se num è zero
- Restituisce 1, terminando lo stack di chiamate recurse e c ausing ogni num tornato per iniziare moltiplicando
- ritorno num
Non ci sono staffe in pitone; Ho pensato che in qualche modo ha cambiato le cose, quindi ho rimosso le parentesi dal codice Java, ma non è cambiato. Cambiare il valore booleano (num! = 0) in (num> 0) non ha modificato nulla. L'aggiunta di un'istruzione if all'altra forniva più contesto, ma il valore era sempre lo stesso.
Stampa dei valori di num in ogni punto dà un'idea di come la funzione va storto:
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 costante aumento. In 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
Non un aumento costante. Infatti, num restituisce numeri negativi, come se la funzione restituisse numeri negativi, anche se num non dovrebbe essere sotto zero.
Entrambi i codici Python e Java procedono con la stessa procedura, tuttavia restituiscono valori molto diversi. Perché sta succedendo?
Overflow intero ... – Mysticial
Python promuove da int a long automaticamente mentre java no. – jamylak
Questa è una grande domanda in quanto è qualcosa in cui tutte le domande-rispondenti qui capiscono immediatamente il problema, ma è qualcosa che non si può veramente cercare a meno che non si sappia già quale sia il problema chiamato. –