Nhập môn Tư duy Lập trình/Mini challenge — hoán đổi hai biến
6/7
Bài 6 / 7~10 phútMáy thực thi lệnh thế nàoMiễn phí lượt xem

Mini challenge — hoán đổi hai biến

Ba dòng gán, hai biến, một câu hỏi: chạy xong thì mỗi biến bằng mấy? Phép thử thật cho mô hình ô nhớ bạn vừa dựng ở hai bài trước.

Đoán sai bài này là chuyện thường — con người mặc định nghĩ "hoán đổi" là một hành động tức thời, còn máy thì chỉ biết chạy đúng từng dòng một, không có tức thời nào cả.

1. Đề bài

x đang giữ 5. y đang giữ 8. Nhiệm vụ: đổi chỗ hai giá trị này, sao cho sau khi chạy xong, x bằng 8y bằng 5.

Không cần biết thuật toán hoán đổi là gì. Chỉ cần một thứ: trace đúng từng dòng gán bằng kỹ thuật bạn học ở bài 04, và tin vào bảng đó hơn tin vào trực giác.

2. Bản đầu tiên: bốn dòng gán

Thử đoán trước khi đọc tiếp

Đừng đọc phần dưới ngay. Vẽ bảng trace hai cột x, y như bài 04 — mỗi dòng gán một hàng. Điền xong, viết ra hai số mà hai lệnh print in ra.

# swap khong dung bien tam (loi)
x = 5
y = 8

x = y
y = x

print(x)
print(y)

3. Kết quả thật

8
8

Nếu bảng trace của bạn ra đúng 8 rồi 8, bạn vừa trace đúng — dù kết quả đó không phải điều đề bài cần (85, không phải 88). Nếu bạn đoán 8 rồi 5, coi lại bảng: giá trị 5 biến mất ở đúng một dòng, và dòng đó không phải dòng cuối.

4. Vì sao 5 biến mất

Nhìn lại hàng ứng với dòng x = y trong bảng của bạn. Đó là dòng ô x bị ghi đè thành 8. Từ dòng đó trở đi, giá trị 5 không còn nằm ở đâu trong chương trình nữa — ô nhớ x chỉ giữ đúng một giá trị tại một thời điểm (bài 02), và giá trị cũ không được cất đi trước khi bị ghi đè.

Đến dòng y = x, máy đọc đúng những gì đang có trong ô x lúc đó — mà lúc đó ô x đã là 8, không còn là 5. y chép đúng cái đang có, không chép cái từng có.

5. Bản có biến tạm: bốn dòng gán khác

Thử đoán trước khi đọc tiếp

Trace lại bốn dòng gán dưới đây, lần này thêm cột temp vào bảng. xy sau cùng bằng bao nhiêu?

# swap dung bien tam (dung)
x = 5
y = 8

temp = x
x = y
y = temp

print(x)
print(y)

6. Kết quả thật

8
5

7. Điều bạn vừa làm được

temp không phải một mẹo cần học thuộc. Nó là một ô nhớ thứ ba, dùng để giữ giá trị cũ của x lại đúng lúc x sắp bị ghi đè — để dòng y = temp sau đó vẫn còn chỗ mà lấy 5 ra. Không có temp, giá trị 5 bị ghi đè ở dòng thứ ba và không ai cứu được nó nữa.

Bug ở bản đầu tiên không nằm ở chỗ "không biết thuật toán hoán đổi" — nó nằm ở chỗ ghi đè một ô nhớ trước khi giá trị cũ của ô đó được đọc xong ở nơi khác. Chuyện này xảy ra bất cứ đâu có gán lại biến, không riêng gì hoán đổi: cộng dồn vào một biến đếm, cập nhật một biến tổng, đều có thể dính đúng bug này nếu thứ tự dòng sai. Công cụ để bắt được nó luôn là một thứ: bảng trace bạn vừa dùng hai lần ở trên.

Bài tiếp theo: Tổng kết module

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Tổng kết module — bạn đã có cỗ máy trong đầu