Tôi đã không liên lạc được với Thuật toán trong một thời gian và đã bắt đầu sửa đổi các khái niệm của mình trong những ngày này. Trước sự ngạc nhiên của tôi, lần cuối tôi nhớ về kỹ năng thu thập của tôi là tôi đã giỏi nhưng không còn nữa. Vì vậy, tôi có một câu hỏi cơ bản cho các bạn, điều khiến tôi khó hiểu. Xin vui lòng xem mã bên dưới đầu tiên ..Hai cuộc gọi đệ quy trong một chức năng Hợp nhất sắp xếp nhầm lẫn
private void mergesort(int low, int high) {
if (low < high) {
int middle = (low + high)/2 ;
System.out .println ("Before the 1st Call");
mergesort(low, middle);
System.out .println ("After the 1st Call");
mergesort(middle+1, high);
System.out .println ("After the 2nd Call");
merge(low, middle, high);
}
}
Chức năng gọi
mergesort(0,7);
Và đầu ra là
Trước Call 1st
Trước Call 1st
Trước cuộc gọi đầu tiên
Sau Gọi 1
Sau khi cuộc gọi thứ 2
Sau Gọi 1
Trước Call 1st
Sau Gọi 1
Sau khi cuộc gọi thứ 2
Sau cuộc gọi thứ hai
Sau Gọi 1
Trước Call 1st
Trước Call 1st
Sau Gọi 1
Sau khi cuộc gọi thứ 2
Sau Gọi 1
Trước cuộc gọi đầu tiên
Sau Gọi 1
Sau khi cuộc gọi thứ 2
Sau khi cuộc gọi thứ 2
Sau khi cuộc gọi thứ 2
Điều khó hiểu cho tôi trong đoạn code trên và kết quả là lần thứ hai gọi đệ quy. Tôi hiểu luồng cho đến dòng đầu ra thứ tư (ví dụ: Sau lần gọi đầu tiên). Nhưng tôi không thể hiểu tại sao nó kết quả đầu ra (sau khi gọi 2) sau khi (sau khi gọi 1). Theo whati am hiểu từ mã Sau khi đầu ra (Sau khi gọi 1) chức năng mergesort với tham số (giữa + 1, cao) nên được gọi và nó nên đầu ra (Trước khi gọi 1) và đi vào cuộc gọi đệ quy với mergesort (thấp, trung bình). Tôi đang comfartable với một chức năng gọi đệ quy và hiểu và đồng bộ với ví dụ foreg fibonacci.
Hãy thử cung cấp cho nó một số nhỏ hơn, sau đó theo dõi thông qua đầu ra. Nó có thể làm cho nó dễ dàng hơn một chút để xem. –
Sử dụng trình gỡ lỗi! không phải rác thải println này! –