Cách viết thuật toán là một trong những từ khóa được tìm kiếm nhiều nhất trên google về chủ đề Cách viết thuật toán. Trong bài viết này, coder.com.vn sẽ viết bài Cách viết thuật toán để giải quyết các vấn đề trong lập trình 2020
Bí kíp dành cho những lập trình viên mới vào nghề không biết bắt đầu từ đâu
Tôi nghe một số developer mới vào nghề đang xoay sở , không biết bắt đầu từ đâu rằng họ hiểu vấn đề, hiểu logic, các syntax căn bản, etc. Lúc Quan sát code của người đối diện thì có thể hiểu, nhưng nếu như tự làm thì lại không cảm thấy chắc ăn lắm khi chuyển suy nghĩ của mình thành code kể cả khi họ hiểu syntax hoặc logic. đây chính là trình tự hoặc là các bí kíp để xử lý những vấn đề(ví dụ) đó, mong rằng sẽ hữu ích với bạn.
1. Đọc vấn đề ít nhất 3. lần(hoặc cho đến khi nào bạn cảm nhận thấy thoải mái)
Bạn không thể xử lý lỗi lo nếu bạn không hiểu(đừng thử vận may bằng việc sửa hàm này, sửa biến kia). Có sự khác nhau giữa vấn đề thật sự , vấn đề mà bạn tưởng tượng là mình đang sửa. Đọc vài line code đầu , bạn sẽ giản đơn lâm vào sai lạc là giả định phần khác của nó cũng tương tự. nếu làm một cái game được nhiều người biết đến như Hangman, chắc chắn rằng mình đã đọc qua tổng cộng các rule kể cả khi mà bạn đã từng chơi nó trước đây. Một lần tôi làm game giống Hangman , phát hiện ra rằng mình chỉ là “Hangman Quỷ Dữ” vì chỉ đọc hướng dẫn mà không đọc tất cả những rule. vì lẽ đó hãy đọc nốt pần code còn lại. Đừng hiểu một nửa, sẽ khiến bạn hiểu nhầm lỗi lo, bỏ thêm thời gian ban đầu này sẽ có giá trị, càng hiểu nhiều thì sẽ càng xử lý vấn đề dễ dàng.
Giả vờ như chúng ta đang xây dựng một function dễ dàng selectEvenNumbers
là trả về một mảng những số chẵn evenNumbers
tại một mảng hỗn hợp các con số chẵn lẻ. nếu như không có số chẵn nào cả thì trả về mảng rỗng evenNumbers
functionselectEvenNumbers() // your code here
Sau đây chính là vài câu hỏi chạy qua trong đầu tôi:
- làm cách nào mà máy tính biết số nào là chẵn? Chia nó cho 2 , xem phần khác có là 0
- Tôi sẽ gán cái gì vào function này? Một array
- Mảng đó chứa cái gì? Một hoặc vài con số One or more numbers
- Kiểu dữ liệu của từng element trong array? các con số
- mục tiêu của function này là gì? Tôi sẽ trả về những cái gì vào cuối function? mục đích là lướt qua những phần tử , chọn ra những số chẵn rồi cho nó vào array , trả về ở cuối function, nếu như không có số chẵn nào thì trả về array rỗng.
2. Thử bằng tay tối thiểu 3 set dữ liệu mẫu khi giải quyết lỗi lo
Thu thập một mớ giấy viết và thử bằng tay ít nhất 3 set dữ liệu mẫu. Thử những trường hợp góc cũng giống như là cạnh
chẳng hạn như, sau đây chính là một số mẫu data có thể dùng:
[1] [1, 2] [1, 2., 3và 4., 5, 6] [-200.25] [-800.1, 2000, 3.1, -1000.25, 4và 600]
Khi mới bắt đầu, rất dễ bị bỏ lỡ chu trình. Bởi vì não của bạn đã quen với các số chẵn, bạn sẽ Nhìn vào các dữ liệu mẫu trên và tập trung vào các số như 2
và 4.
và 6.
, từ đấy trở đi không còn cẩn thận làm toàn bộ chu trình để cải thiện lỗi lo. nếu đây chính là thách thức, “thà một lần đau” thử dùng một lương dữ liệu mẫu thật lớn để tập cho não bạn thói quen giải quyết cụ thể từng bước một
Bây giờ hãy quan sát vào array [1]
- Soi vào element duy nhất của array
[1]
- chọn lựa nó là chẵn hoặc lẻ
- lưu ý rằng không còn element nào khác tại array
- Thấy rằng không có số chẵn nào tại array này
- Trả về array rỗng
hiện nay hãy quan sát vào array [1, 2.
- tập trung vào element trước tiên của array
[1, 2.
- Nó là
1
- chọn lựa nó là chẵn hay lẻ
- tập trung vào element tiếp theo tại array
- Nó là
2.
- Đúng nó là chẵn rồi
- xây dựng một array
evenNumbers
, thêm2.
vào array này - lưu ý rằng không còn element nào tại array này
- Trả về array
evenNumbers
trong số đó có[2]
Tôi làm như vậy vài lần. chú ý là chu trình tôi viết ra cho [1]
có điều chỉnh một tí từ [1, 2
. đó là nguyên nhân vì sao tôi thử với nhiều set dữ liệu mẫu không giống nhau. Có vài set có 1 element, có set thì số thập phân thay vì số nguyên, một vài thì số có nhiều chữ số, một vài thì là số âm…
3 Đơn giản hóa và tối ưu hóa chu trình
Tìm các mẫu chung và xem có khả năng rút ngắn cái gì hay không, để có khả năng giảm một số bước lặp đi lặp lại
- tạo một function
selectEvenNumbers
- xây dựng một array rỗng
evenNumbers
để lưu những số chẵn nếu có - Lướt qua những element tại array
[1, 2.
- Tìm element trước tiên
- lựa chọn nếu nó là chẵn bằng việc chia hết cho 2. rồi add nó vào
evenNumbers
- Tìm element tiếp theo
- Lặp lại bước #4
- Lặp lại bước #5 , #4 cho đến khi không để lại element nào trong array
- Trả về array
evenNumbers
, không cần để ý có cái gì trong số đó

chẳng hạn như về viết code giả
4. Viết code giả
Ngay cả Khi mà đã hoàn thành các bước chung chung, viết ra những mã để chuyển hóa ý tưởng sẽ giúp lựa chọn được cấu trúc của code và làm cho việc viết code đơn giản hơn nhiều. Viết code giả bằng tay từng dòng một. Bạn có khả năng làm trên giấy hoặc trên editor. Tôi đề xuất bạn viết trên giấy để tập trung vượt trội hơn.
Mã giả Quan sát chung không thực sự có luật lệ nào chi tiết tuy nhiên có nhiều khi, tôi vẫn ứng dụng những syntax từ phương ngữ lập trình vì tôi đủ quen thuộc với ngôn ngữ đấy. tuy nhiên đừng quá chú trọng syntax mà hãy tích tụ logic , quá trình chạy code trên kia
Đối với ví dụ trên, có vô số bí quyết không giống nhau. chẳng hạn như bạn có thể dùng filter
nhưng để cho giản đơn và dễ quan sát, chúng ta dùng vòng lặp for
cơ bản(nhưng sẽ sử dụng filter
sau, khi cấu trúc lại code).
Xem thêm: Hướng dẫn cách học lập trình cơ bản cho người mới bắt đầu
Đây là chẳng hạn như của mã giả viết một bí quyết dài dòng:
function selectEvenNumbers
create an array evenNumbers andset that equal to an empty array foreachelementin that array see if that elementis even ifelementis even (if there is a remainderwhen divided by2.) addto that to the array evenNumbers return evenNumbers
đây chính là chẳng hạn như của mã giả viết một bí quyết ngắn gọn hơn:
functionselectEvenNumbers
evenNumbers = [] for i = 0 to i = length of evenNumbers if (element % 2 === 0) add to that to the array evenNumbersreturn evenNumbers
Dù làm thế nào cũng đều được miễn là bạn viết ra từng dòng một , hiểu logic của từng dòng.
5 Chuyển mã giả lịch sự code , debug
Sau khi xong xuôi mã giả, chuyển đổi từng dòng sang code thực bằng ngôn ngữ mà bạn đang làm việc. Tôi dùng Javascript cho ví dụ này.
Nếu bạn đã viết nó ra giấy, gõ lại nó trên editor rồi replace từng dòng
Sau đấy tôi gọi function và truyền vào những dữ liệu mẫu mà chúng ta sử dụng lúc trước. Tôi dùng chúng để xem kết quả trả về có đúng ý muốn hay không. Bạn cũng có khả năng viết các test case đề kiểm duyệt output có đúng mong đợi nữa không.
selectEvenNumbers([1])selectEvenNumbers([1, 2])selectEvenNumbers([1, 2. 3. 4 5. 6])selectEvenNumbers([-200.25])selectEvenNumbers([-800.1, 2000, 3..1, -1000.25, 4, 600])
Tôi sử dụng console.log()
sau mỗi biến hoặc dòng để theo dõi biết hay code có hoạt động như mong đợi trước khi tiếp tục bước kế tiếp, bằng cách này tôi bắt được bất cứ lỗi nào trước khi sai quá xa. phía dưới là chẳng hạn như
functionselectEvenNumbers(arrayofNumbers) let evenNumbers = []
console.log(evenNumbers) // I remove this after checking outputconsole.log(arrayofNumbers) // I remove this after checking output
Sau khi bước qua từng dòng mã giả, tôi để lại //
. Còn text đậm là code thực sự bằng JavaScript.
// function selectEvenNumbers
functionselectEvenNumbers(arrayofNumbers)
// evenNumbers = []let evenNumbers = []
// for i = 0 to i = length of evenNumbersfor (var i = 0; i < arrayofNumbers.length; i++)
// if (element % 2 === 0)if (arrayofNumbers[i] % 2 === 0)
// add to that to the array evenNumbersevenNumbers.push(arrayofNumbers[i])
// return evenNumbersreturn evenNumbers
Sau đấy bỏ mã giả:
functionselectEvenNumbers(arrayofNumbers) let evenNumbers = []for (var i = 0; i < arrayofNumbers.length; i++) if (arrayofNumbers[i] % 2 === 0)
evenNumbers.push(arrayofNumbers[i])
return evenNumbers
đôi khi các developer mới vào nghề sẽ bị mắc kẹt với syntax làm cản trở việc tiến lên phía trước. Hãy nhớ rằng syntax chỉ trở nên tự nhiên , quen thuộc Sau khi làm việc lâu năm , không hề có gì không tốt hổ khi tra lại các tài liệu để hoàn chỉnh cú pháp sau này, khi code thật sự.

6. Dễ dàng hóa , tối ưu hóa code của bạn
Trong chẳng hạn như này, một bí quyết sửa đổi và cải thiện nó bằng cách lọc ra các item từ array, trả về array mới sử dụng filter
. Theo đó, chúng ta không nhất thiết phải define một biến mới evenNumbers
bởi vì filter
sẽ trả về array mới với những bản sao của những element đã lọc phù hợp, không khác gì bí quyết thuở đầu, cũng không nhất thiết phải sử dụng vòng lặp for
. filter
sẽ duyệt đến từng item, trả về true
, để có element đấy tại array hoặc về false
để bỏ lỡ nó.
functionselectEvenNumbers(arrayofNumbers) let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)return evenNumbers
7. Debug
Khi tôi tìm kiếm những bug, tôi tra từng dòng code để coi việc gì không đúng đã diễn ra. Sau đây là một số kỹ thuật tôi dùng:
- Kiềm tra console coi các thông điệp lỗi. đôi lúc nó sẽ chỉ ra line nào và mình bắt đầu từ chỗ đó, những cũng có khi lỗi thật sự lại nằm ở line khác.
- bình luận ngăn chặn một số dòng code , output ra những cái gì mình cần để mau chóng có được những nội dung về hành động của code.
- dùng các dữ liệu mẫu khác và coi nó hoạt động ra sao
- Lưu thành nhiều phiên bản không giống nhau , thử từng cách đến gần hơn riêng biệt. giống như nhiều mẫu thử tại phòng thí nghiệm để làm giảm tấn công mất một hậu quả đặc biệt hoặc đúng đắn nào đó trong suốt quá trình thử nghiệm
8 Viết những comment hữu ích
Bạn khó lòng luôn nhớ được công dụng xuất sắc của từng dòng code trong một tháng tới, , người đối diện lại càng không. đó là lý do vì sao viết comment có ích cực kì quan trọng để hạn chế các vấn đề , tiết kiệm thời gian khi mà bạn quay quay lại với nó sau này.
tuy nhiên cũng làm giảm các comment như sau:
// đây chính là mảng nhe. Duyệt qua nó.
// đây là biến
Tôi nỗ lực viết tóm lược để người coi comment có khả năng hiểu những cái gì đang diễn ra nếu nó không thực sự rõ ràng. nhất là ở những đoạn code khó khăn, giải thích rõ từng function để làm gì và tại sao. Cũng nên dùng những tên biến, tên function và những bình luận rõ để bạn và người xung quanh có thể hiểu:
- Code này để làm gì?
- Code này đang làm gì?

9. Nhận phản hồi thông qua những code review
Nhận góp ý từ các cộng sự, các chuyên gia hoặc các developer khác. Check lại trong Stack Overflow. xem cách mà những người xung quanh hỏi về lỗi lo đó và học từ nó. có nhiều khi một vấn đề có nhiều cách tiếp cận. làm rõ nó là gì sẽ nhanh , vượt trội hơn cho bạn
10. Thực hành, thực hành, thực hành
Kể cả những developer nhiều trải nghiệm vẫn luôn thực hành và học hỏi. nếu như thu được phản hồi hữu ích, hãy tích hợp nó, tái hiện lại problem hoặc fix problem tương tự, thúc đẩy bạn tiến lên, mỗi problem bạn xử lý xong là một bước tiến vượt trội hơn cho bạn trên đoạn đường làm developer. Hãy ăn mừng mỗi chiến thắng , nhớ rằng bạn đã tiến xa ra sao.
Xem thêm: Ngôn ngữ lập trình là gì? Tổng hợp các ngôn ngữ lập trình thường dùng nhất hiện nay
Nguồn: https://techtalk.vn/