Triển khai Selection và Iteration
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| accumulator/əˈkjuːmjʊleɪtə/ | thanh ghi tích lũy |
Một giá trị cực đại ban đầu bằng không tạo ra kết quả sai
- Một mảng chứa −8, −3 và −11. Bắt đầu max ở mức zero sẽ để lại một giá trị cực đại chưa từng xuất hiện trong mảng.
- Đối với mảng không rỗng này, hãy bắt đầu max tại a[0]. So sánh các giá trị sau sẽ cập nhật −8 thành −3 và giữ nguyên nó ở đó.
Mẫu vòng lặp: tích lũy
- Một mẫu lặp (loop pattern) là công thức có thể tái sử dụng cho một tác vụ phổ biến. Mẫu bộ tích lũy (accumulator) xây dựng tổng hoặc tích chạy theo mỗi lần lặp.
- Bắt đầu
sum = 0, sau đósum = sum + xbên trong vòng lặp; tổng chạy thay đổi; nó có thể giảm đi khi cộng một giá trị âm. Ý tưởng tương tự áp dụng cho đếm chạy (count++) hoặc cực đại chạy.
Điều kiện bên trong vòng lặp
- Đặt một
ifbên trong vòng lặp để chỉ tác động lên các mục phù hợp. "Đếm các số chẵn": vòng lặp, vàif (x % 2 == 0) count++; - Vòng lặp truy cập từng mục;
ifquyết định những mục nào cần xử lý. Kết hợp lựa chọn và lặp lại là cốt lõi của hầu hết các thuật toán.
Tìm giá trị lớn nhất
- Để tìm giá trị lớn nhất, hãy giữ một biến
maxvà cập nhật nó khi thấy cái gì đó lớn hơn. Kiểm tra mảng không rỗng, bắt đầumaxtại giá trị đầu tiên, sau đó kiểm tra phần còn lại. Một “số rất nhỏ” không xác định vẫn có thể vượt quá mọi đầu vào thực tế. if (x > max) { max = x; }bên trong vòng lặp. Sau vòng lặp,maxchứa giá trị lớn nhất đã nhìn thấy.
Mẫu tích lũy (accumulator pattern)
sum tích lũy qua các lần lặp; nó bắt đầu từ 0.
Để xây dựng một TÍCH LŨY TÍNH trong vòng lặp, bạn nên khởi tạo bộ tích lũy với...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một tổng bắt đầu từ 0; một tích sẽ bắt đầu từ 1.
Để xây dựng một TÍCH LŨY TÍNH, khởi tạo bộ tích lũy với...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Bắt đầu một tích từ 0 sẽ luôn bằng 0; hãy bắt đầu từ 1.
Để đếm các số chẵn trong khi lặp, bạn sử dụng...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
The if chọn lọc những mục mà vòng lặp cần đếm.
Đặt việc khởi tạo bộ tích lũy bên trong vòng lặp sẽ đặt lại nó ở mỗi lần lặp.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Khởi tạo trước vòng lặp, không phải bên trong nó.
Để dừng vòng lặp ngay khi tìm thấy mục tiêu, bạn có thể dùng...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
break thoát khỏi vòng lặp gần nhất. Một biến cờ Boolean cũng cần được sử dụng trong điều kiện vòng lặp hoặc logic điều khiển; chỉ gán giá trị cho nó thì không dừng việc thực thi.
Thoát sớm với cờ hoặc lệnh break
- Đôi khi bạn có thể dừng sớm ngay khi tìm thấy thứ mình cần. Một cờ
booleancó thể ghi nhận “đã tìm thấy” và được kiểm tra bởi điều kiện vòng lặp; việc gán cờ đơn thuần không thoát khỏi vòng lặp.breakthoát ngay lập tức khỏi vòng lặp lồng sâu nhất. - "Danh sách có chứa số không?" — dừng ở số không đầu tiên. Thoát sớm tiết kiệm công sức nhưng hãy giữ logic đúng cho trường hợp "không tìm thấy".
Khởi tạo bộ tích lũy đúng cách, nếu không mọi kết quả đều sai. Một tổng bắt đầu ở 0, một tích ở 1 (bắt đầu tích ở 0 sẽ khiến nó luôn là 0), một cực đại ở phần tử đầu tiên sau khi kiểm tra mảng không rỗng. Một tập hợp rỗng không có cực đại trừ khi hợp đồng định nghĩa rõ ràng một kết quả riêng biệt. Và cập nhật nó mọi lần lặp phù hợp — một khởi tạo đặt sai bên trong vòng lặp sẽ reset lại nó ở mỗi lượt và phá hủy tổng.
What is the maximum of the nonempty array {−8, −3, −11}?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
−3 is the greatest actual element. Starting at 0 produces an invalid invented candidate.
Đọc a[0] là một cách hợp lệ để khởi tạo giá trị tối đa cho mảng rỗng.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Không có phần tử đầu tiên nào trong mảng rỗng. Hãy kiểm tra dữ liệu đầu vào hoặc xác định một kết quả riêng biệt cho trường hợp không có giá trị tối đa.
Có bao nhiêu số chẵn trong mảng int {-8, -3, -11}?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Chỉ có -8 có dư bằng 0 khi chia cho 2; giá trị âm cũng có thể là số chẵn.
Đếm số chẵn trong vòng lặp qua mảng a:
int count = 0;for (int i = 0; i < a.length; i++) { if (a[i] % 2 == 0) count++; }- Vòng lặp truy cập từng phần tử; biến
ifchỉ đếm các số chẵn.
Mở rộng suy luận sang trường hợp mới
- Mảng rỗng không có phần tử đầu tiên và cần một hợp đồng hoặc kiểm tra riêng biệt.
- Giá trị khởi tạo phải phù hợp với phép toán: tổng là 0, tích là 1, giá trị lớn nhất là một ứng viên bắt đầu hợp lệ.
Các mẫu vòng lặp phổ biến kết hợp lặp và chọn lọc: một biến tích lũy (sum += x, đếm, hoặc max đang chạy) được xây dựng qua các lần lặp, với một if bên trong để xử lý chỉ các mục phù hợp. Khởi tạo biến tích lũy đúng cách (sum 0, product 1, max là giá trị đầu tiên), và cân nhắc thoát sớm (break/cờ) khi đã tìm thấy đáp án.