Tôi đã thử nghiệm với Python như một người nhận thức trong vài giờ qua. Tôi đã viết một hàm đệ quy, trả về recurse (x) là x! trong Python và trong Java, để so sánh hai. Hai đoạn mã giống hệt nhau, nhưng vì một lý do nào đó, mã Python hoạt động, trong khi mã Java thì không. Trong Python, tôi đã viết:Tại sao hai đoạn mã tương tự lại tạo ra các kết quả khác nhau?
x = int(raw_input("Enter: "))
def recurse(num):
if num != 0:
num = num * recurse(num-1)
else:
return 1
return num
print recurse(x)
đâu biến num sẽ nhân bản thân bằng cách num-1 cho đến khi nó đạt đến 0, và kết quả đầu ra kết quả. Trong Java, mã này là rất giống nhau, chỉ còn:
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;
}
}
Nếu tôi nhập 25, Bộ luật Python trả 1.5511x10E25, đó là câu trả lời đúng, nhưng mã Java trả 2076180480, mà không phải là câu trả lời đúng, và tôi không chắc tại sao.
Cả hai mã đi về cùng quá trình:
- Kiểm tra xem num là zero
- Nếu num không phải là zero
- num = num nhân với đệ quy của num - 1
- Nếu số không là số
- Trả lại 1, kết thúc chồng cuộc gọi recurse đó và c ausing mỗi num trở lại bắt đầu nhân
- trở num
Không có dấu ngoặc trong python; Tôi nghĩ rằng bằng cách nào đó đã thay đổi mọi thứ, vì vậy tôi đã loại bỏ các dấu ngoặc đơn khỏi mã Java, nhưng nó không thay đổi. Thay đổi boolean (num! = 0) thành (num> 0) cũng không thay đổi gì cả. Thêm câu lệnh if vào ngữ cảnh được cung cấp khác, nhưng giá trị vẫn như cũ.
in các giá trị của num tại mọi điểm đưa ra một ý tưởng về cách các chức năng đi sai:
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
Một gia tăng ổn định. Trong 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
Không tăng đều đặn. Thực tế, num đang trả lại số số âm, như thể hàm trả về số âm, mặc dù num không được nhận dưới 0.
Cả mã Python và Java đều đang thực hiện cùng một quy trình, nhưng chúng đang trả lại các giá trị cực kỳ khác nhau. Tại sao chuyện này đang xảy ra?
Số nguyên tràn ... – Mysticial
Python quảng bá từ int đến dài tự động trong khi java thì không. – jamylak
Đây là một câu hỏi hay ở chỗ đó là điều mà tất cả những người trả lời câu hỏi ở đây ngay lập tức hiểu được vấn đề, nhưng đó là điều bạn không thể tìm kiếm trừ khi bạn đã biết những gì mà vấn đề được gọi. –