Nhập môn Tư duy Lập trình/Mini challenge — trace một vòng lặp lồng
14/31
Bài 14 / 31~12 phútRẽ nhánh & lặpMiễn phí lượt xem

Mini challenge — trace một vòng lặp lồng

Lấy giấy ra. Một vòng lặp lồng mười dòng, không giảng gì trước, không gợi ý sẵn: kẻ bảng trace và nói đúng dãy số nó in ra.

Trace sai bài này ở lần đầu là chuyện bình thường, và gần như ai cũng sai ở đúng một trong hai chỗ. Điều phân biệt người trace được với người đoán mò không phải là đúng ngay lần đầu — mà là có kẻ bảng ra giấy hay không.

Bài này không giảng gì mới. Sáu bài vừa rồi đã đưa đủ công cụ; đây là chỗ bạn tự cầm chúng lên.

1. Đề bài

a = [1, 2, 3]
b = [1, 2]
tong = 0

for x in a:
    for y in b:
        if x > y:
            tong = tong + x
        else:
            tong = tong + y
    print(tong)

Ba câu hỏi, trả lời cả ba trước khi đọc tiếp:

  1. Chương trình in ra mấy dòng?
  2. Dãy số in ra là gì, theo đúng thứ tự?
  3. Thân trong cùng — cụm if/else — chạy tất cả bao nhiêu lần?

2. Lấy giấy — bảng trace cho vòng lặp lồng

Bảng trace ở module trước có mỗi hàng là một dòng lệnh. Với vòng lặp lồng, tiện hơn là mỗi hàng một lần chạy thân trong, và thêm một cột cho vòng ngoài.

Kẻ bảng năm cột trên giấy:

Vòng ngoài xVòng trong yx > y ra gìCộng thêm mấytong sau đó

Điền một hàng cho mỗi lần thân trong chạy. Rồi đánh dấu vào những chỗ dòng print chạy — nó không nằm cùng tầng với thân trong.

Quy tắc cũ vẫn nguyên: tính vế phải bằng giá trị bạn vừa ghi ở hàng trước, không phải giá trị bạn nghĩ nó nên là.

3. Gợi ý

Chỉ mở phần này nếu bạn đã kẻ bảng và bị kẹt. Đây là câu hỏi định hướng, không phải đáp án.

Gợi ý — bốn câu hỏi tự trả lời

4. Đối chiếu

Chỉ mở sau khi bạn đã viết ra cả ba câu trả lời ở mục 1.

Đáp án đầy đủ

5. Phần hai — sắp lại và tự đặt lề

Phần trên bạn đọc code có sẵn. Phần này ngược lại: các dòng đã có nhưng nằm lẫn lộn và mất hết thụt lề — bạn phải tự đặt lại từng dòng vào đúng tầng.

Chương trình cần đếm số lần thân trong chạy và in tổng tích luỹ sau mỗi lượt vòng ngoài. Output mong đợi:

2
4
6
Sắp lại thứ tự dòng

Đưa từng dòng vào khung lời giải rồi xếp cho đúng thứ tự và đúng thụt lề. Kho có thể chứa dòng thừa.

Kho dòng (6)

  • tong = tong + 1
  • tong = 0
  • print(tong)
  • tong = tong + x
  • for x in [1, 2, 3]:
  • for y in [1, 2]:

Lời giải của bạn (0/5)

Chưa có dòng nào. Bấm “Đưa vào” ở trên.

Gợi ý: Ba tầng lề, không phải hai. Hỏi từng dòng: cái này chạy một lần cho cả chương trình, một lần cho mỗi vòng ngoài, hay một lần cho mỗi vòng trong?

Nút mũi tên trái phải đặt bậc thụt lề. Dòng nào cùng bậc thì chạy cùng nhịp — đó là toàn bộ thứ bài tập này kiểm tra.

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

Bạn vừa trace một chương trình có cả ba cấu trúc điều khiển chồng lên nhau: tuần tự trong thân, rẽ nhánh chọn giá trị cộng vào, và hai tầng lặp. Không ai chỉ cho bạn nhánh nào chạy, không ai điền sẵn hàng nào của bảng.

Cụ thể hơn, bạn vừa dùng lại bốn thứ từ bốn bài khác nhau cùng một lúc:

  • Bảng trace từ module trước, mở rộng thêm cột cho vòng ngoài.
  • Quy tắc "nhánh đúng đầu tiên thắng" ở bài 1, áp cho cụm if/else bên trong thân.
  • Biến tích luỹ ở bài 4, và chuyện nó không bị đặt lại giữa các lượt.
  • Quy tắc lề ở bài 5, để biết print chạy ba lần chứ không phải sáu.

Nếu dãy bạn viết ra khớp cả ba con số, bạn đã trace được vòng lặp lồng — kỹ năng này đi thẳng sang mọi ngôn ngữ bạn học sau này, vì for lồng nhau ở Java hay JavaScript cũng chạy đúng cơ chế đó.

Nếu lệch, đừng bỏ qua. Tìm đúng hàng đầu tiên trong bảng của bạn khác với bảng đáp án, rồi đọc lại bài tương ứng — lệch số dòng in thì về bài 5, lệch giá trị tong thì về bài 4.

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ó đủ ba cấu trúc