在过去的几个小时里,我一直在尝试使用 Python 作为初学者。我写了一个递归函数,它返回 recurse(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 代码返回 2,076,180,480,这不是正确答案,我不知道为什么。
两个代码都进行相同的过程:
- 检查 num 是否为零
- 如果 num 不为零
- num = num 乘以 num 的递归 - 1
- 如果 num 为零
- 返回 1,结束递归调用堆栈,并导致每个返回的 num 开始相乘
- 返回号码
python中没有括号;我认为这以某种方式改变了一些事情,所以我从 Java 代码中删除了括号,但它并没有改变。将布尔值 (num != 0) 更改为 (num > 0 ) 也没有改变任何东西。将 if 语句添加到 else 提供了更多上下文,但值仍然相同。
在每个点打印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 代码都在执行相同的过程,但它们返回的值却大相径庭。为什么会这样?