在过去的几个小时里,我一直在用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
这是一个很好的问题,因为这里的所有问题回答者都能立即理解问题,但除非您已经知道问题所在,否则这是您无法真正搜索的问题。 –