Tại sao bạn nên học đệ quy ngay cả khi bạn sẽ không bao giờ sử dụng nó? Các giải pháp đệ quy giúp bạn rèn luyện một vài tư duy: 1. Thay vì cố gắng tạo ra giải pháp, bạn thường bắt đầu với "cấu trúc của một giải pháp hợp lệ là gì" và làm việc ngược lại. Đối với một số vấn đề, làm việc ngược lại dễ hơn nhiều. 2. Khi bạn đang giải quyết vấn đề, rất dễ bị phân tâm bởi tất cả các "nếu như". Khi giải quyết một vấn đề theo cách đệ quy, bạn thường bị buộc phải "bỏ qua" 90% các vấn đề và tập trung vào việc chỉ làm đúng một phần. 3. Những gì thường là một trường hợp "góc" trong một giải pháp mệnh lệnh lại là một "trường hợp cơ bản" trong một giải pháp đệ quy. Suy nghĩ theo cách đệ quy đôi khi buộc bạn không được bỏ qua các trường hợp góc. Hơn nữa, các giải pháp đệ quy sử dụng rất nhiều việc khớp mẫu, vì vậy bạn bị buộc phải nghĩ đến tất cả các tình huống mà bạn có thể gặp phải. Đây là một ví dụ rất tốt: Leetcode 335 Tự cắt (Vấn đề khó). Bạn di chuyển theo một quỹ đạo xoắn ốc trên một lưới (tức là luôn rẽ trái sau khi di chuyển một khoảng cách nào đó về phía bắc, nam, đông hoặc tây). Câu hỏi là, "cho khoảng cách của mỗi 'đoạn' của xoắn ốc theo thứ tự, liệu xoắn ốc có cắt chính nó hay không?" Mặc dù giải pháp cho điều này không cần phải là một hàm gọi chính nó, nhưng giải pháp "đẹp" sử dụng các thuộc tính đệ quy: 1. nếu chúng ta chưa tìm thấy một điểm cắt nào, thì chúng ta có thể giả định rằng không có điểm cắt nào hoặc xoắn ốc không hợp lệ trong quá khứ. Chúng ta cũng nhận thấy rằng không quan trọng nếu chúng ta đang di chuyển sang trái, phải, lên hoặc xuống vì chúng ta chỉ có thể rẽ trái. Tất cả những gì chúng ta quan tâm là liệu các đoạn trước đó có song song với lượt rẽ trước đó của chúng ta và chúng cách xa bao xa. 2. khi chúng ta rẽ trái, có một số lượng "đoạn" rất hạn chế trong xoắn ốc mà chúng ta có thể va chạm vào, điều này là "đệ quy" đúng bất kể xoắn ốc lớn đến đâu. Có rất nhiều dữ liệu trong quá khứ về xoắn ốc mà chúng ta có thể bỏ qua. 3. Có một số lượng hạn chế các kịch bản trong lượt rẽ trước đó của bạn ảnh hưởng đến logic của bạn: a) bạn có di chuyển đủ xa để không va chạm vào bất cứ điều gì không, b) nếu không, bạn có thể va chạm vào điều gì? (cũng hạn chế). Điều phiền phức về các bài khó trên Leetcode là chúng đột nhiên trở nên dễ dàng nếu bạn tìm ra được cái nhìn sâu sắc chính. Nhưng những cái nhìn sâu sắc đó sẽ đến với bạn một cách tự nhiên hơn nếu bạn đã rèn luyện bản thân trong lập trình đệ quy. Nó không chỉ là về việc thiết kế các hàm gọi chính nó — mà là về việc buộc bản thân phải phân tích vấn đề theo cách mà nó có thể được giải quyết bằng một hàm gọi chính nó. Càng nhiều cách bạn có thể phân tích một vấn đề, bạn càng có khả năng tìm ra một giải pháp "aha".
1,65K