我一直在尝试使用Python作为初学者进行实验,过去几个小时写了一个递归函数,用Python和Java分别返回recurse(x)作为x!来比较这两种语言。两段代码完全相同,但由于某种原因,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代码返回2,076,180,480,这不是正确的答案,我不确定为什么。两种代码都采用相同的过程:
- 检查num是否为零 - 如果num不为零 - num = num乘以num - 1的递归 - 如果num为零 - 返回1,结束该递归调用堆栈,并导致每个返回的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代码都在执行相同的过程,但它们返回的值却大相径庭。为什么会发生这种情况?