在過去的幾個小時裏,我一直在用Python做實驗。我寫了一個遞歸函數,返回遞歸(x)爲x!在Python和Java中,比較兩者。這兩段代碼是相同的,但由於某種原因,Python可以工作,而Java則不可以。在Python,我寫道:爲什麼這兩個相似的代碼產生不同的結果?
x = int(raw_input("Enter: "))
def recurse(num):
if num != 0:
num = num * recurse(num-1)
else:
return 1
return num
print recurse(x)
凡可變NUM通過NUM-1,直到它達到0,並輸出該結果乘以本身。在Java中,代碼非常相似,只是長:
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;
}
}
如果我輸入25,將Python代碼返回1.5511x10E25,這是正確的答案,但Java代碼返回2076180480,這是不是正確的答案,我不知道爲什麼。
兩個代碼去相同的過程:
- 檢查num是零
- 如果num不爲零
- NUM = NUM乘以NUM的遞歸 - 1
- 如果num爲零
- 返回1,結束那個遞歸調用堆棧,c ausing每返回NUM開始乘以
- 返回NUM
在Python中沒有括號;我以爲改變了一些東西,所以我從Java代碼中刪除了括號,但它沒有改變。將布爾(num!= 0)更改爲(num> 0)也不會改變任何內容。向else添加if語句提供了更多的上下文,但值仍然相同。
打印在每一點上NUM的值給出的函數是如何出錯的想法:
的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
穩步增長。在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
不是穩步增加。實際上,num返回負數,就好像函數返回負數,即使num不應低於零。
Python和Java代碼都採用相同的過程,但它們返回的參數卻不盡相同。這是爲什麼發生?
Integer溢出... – Mysticial
Python從int自動提升爲long,而java自動提升。 – jamylak
這是一個很好的問題,因爲這裏的所有問題回答者都能立即理解問題,但除非您已經知道問題所在,否則這是您無法真正搜索的問題。 –