- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi đang cố gắng tìm hiểu đệ quy là gì trong lập trình và tôi cần ai đó xác nhận rằng tôi hoàn toàn hiểu nó là gì.
Cách tôi đang cố nghĩ về nó là thông qua việc phát hiện va chạm giữa các vật thể.
Giả sử chúng ta có một hàm. Hàm này được gọi khi xác định được xung đột và được gọi cùng với danh sách các đối tượng để xác định đối tượng nào đã va chạm và đối tượng nào đã va chạm. Đầu tiên nó kiểm tra xem đối tượng đầu tiên trong danh sách có va chạm với bất kỳ đối tượng nào khác không. Nếu đúng, hàm này trả về đối tượng va chạm trong danh sách. Nếu sai, hàm sẽ tự gọi chính nó với danh sách rút gọn loại trừ đối tượng đầu tiên, sau đó lặp lại quy trình để xác định xem đó có phải là đối tượng tiếp theo trong danh sách xung đột hay không.
Đây là hàm đệ quy hữu hạn vì nếu không đáp ứng được điều kiện yêu cầu, nó sẽ tự gọi chính nó bằng cách sử dụng danh sách ngày càng ngắn hơn cho đến khi thỏa mãn về mặt suy diễn điều kiện yêu cầu. Điều này trái ngược với hàm đệ quy vô hạn tiềm năng, ví dụ, trong đó danh sách mà nó gọi chính nó không được rút ngắn mà thứ tự của danh sách là ngẫu nhiên.
Vậy... điều này có đúng không? Hay đây chỉ là một ví dụ khác của sự lặp lại?
Cảm ơn!
biên tập: Tôi thật may mắn khi nhận được ba câu trả lời thực sự hay từ @rici, @Evan và @Jack. Tất cả đều mang lại cho tôi những hiểu biết quý giá về công nghệ và thực tiễn từ những góc độ khác nhau. Cảm ơn!
câu trả lời hay nhất
Bất kỳ sự lặp lại nào cũng có thể được biểu diễn đệ quy. (Và sử dụng các cấu trúc dữ liệu phụ trợ thì ngược lại, nhưng không dễ dàng như vậy.)
Tôi sẽ nói bạn lànghĩ Lặp lại. Đó không phải là điều xấu; tôi không có ý chỉ trích. Nói một cách đơn giản, lời giải thích của bạn có dạng "làm cái này, sau đó làm cái kia và tiếp tục cho đến hết".
Đệ quy là một cách suy nghĩ hơi khác. Tôi đang gặp phải một số vấn đề và tôi chưa biết cách khắc phục chúng. Nhưng tôi nhận thấy rằng nếu tôi biết câu trả lời cho một câu hỏi đơn giản hơn, tôi có thể dễ dàng giải quyết được vấn đề trước mắt. Hơn nữa, có một sốRấtNhững vấn đề đơn giản tôi có thể giải quyết trực tiếp.
Các giải pháp đệ quy dựa trên việc sử dụng các vấn đề đơn giản hơn (nhỏ hơn, ít hơn, bất kỳ thứ gì) để giải quyết vấn đề trước mắt. Làm thế nào để tìm ra cặp đối tượng nào trong một tập hợp đối tượng va chạm nhau?
Nếu có ít hơn 2 phần tử trong tập hợp thì không có cặp nào. Đây là vấn đề đơn giản nhất và nó có lời giải rõ ràng: tập hợp trống.
Ngược lại, tôi chọn một số đối tượng. Tất cả các cặp va chạm đều chứa đối tượng này hoặc không chứa đối tượng này. Vì vậy, điều này mang lại cho tôi hai vấn đề phụ.
Một tập va chạm không liên quan đến đối tượng đã chọn rõ ràng là cùng một vấn đề mà tôi gặp phải lúc đầu, nhưng với một tập va chạm nhỏ hơn. Vì vậy tôi đã thay thế phần này của vấn đề bằng một phần nhỏ hơn. Đây là một sự đệ quy.
Nhưng tôi cũng cần tập hợp các đối tượng mà đối tượng được chọn va chạm (có thể là tập hợp trống). Đây là một vấn đề đơn giản hơn vì bây giờ một phần tử trong mỗi cặp đã được biết. Tôi cũng có thể giải quyết vấn đề này một cách đệ quy:
Tôi cần một bộ sưu tập theo cặp chứa một đối tượng X và một tập hợp các đối tượng S.
Nếu tập trống thì không có cặp nào. Đơn giản.
Nếu không, tôi chọn một số thành phần từ bộ sưu tập. Sau đó, tôi tìm thấy tất cả xung đột giữa X và phần còn lại của tập hợp (một vấn đề đơn giản hơn nhưng giống hệt nhau).
Nếu có xung đột giữa X và phần tử được chọn, tôi sẽ thêm nó vào tập hợp tôi vừa tìm thấy.
Sau đó tôi trả lại bộ đồ.
Về thuật toán - đây có phải là cách nghĩ đúng đắn về đệ quy trong lập trình? (Ví dụ), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30381847/
Câu hỏi này đã có câu trả lời: Làm cách nào để so sánh chuỗi không phân biệt chữ hoa chữ thường? (23 câu trả lời) Đã đóng 3 năm trước. Người dùng viết "bóng đá" vào trường nhập của tôi rồi thực hiện bước 6
À, không quen với chuỗi trong javascript. character_id= + id + Correct= + CorrectOrIn Chính xác Đây là những gì tôi cần để tạo thành một chuỗi. Nếu bạn không đoán được nhân vật
$(function() { var base_price = 0; CalculatePrice(); $(".math1").on('change', function(e) { Calc
Tôi không thể tìm thấy bất kỳ bài viết nào trả lời câu hỏi: Triển khai Spinnaker vào cùng cụm Kubernetes mà Spinnaker sẽ quản lý có an toàn/chính xác không? Ý tôi chủ yếu là sản xuất, triển khai HA. Câu trả lời hay nhất tôi nghĩ là Spinnaker và Kuberne
Tôi đang xây dựng Qt5 (Qt 5.15.0) trên Windows từ nguồn (bản phát hành nguồn chính thức, không phải từ kho lưu trữ) bằng MSVC. Tôi đang thiết lập môi trường. các biến, phần phụ thuộc, v.v. sau đó chạy cấu hình với 16 triệu tùy chọn và cuối cùng
Tôi cần in một mảng chứa các từ lặp lại. Mảng của tôi đã hoạt động nhưng tôi không biết cách đếm các từ một cách chính xác. Tôi đã biết rằng khi bộ đếm chỉ số của tôi (i) là 49 và khi (i) muốn đếm đến 50 thì tôi gặp lỗi, nhưng tôi không biết
Tôi đang làm theo hướng dẫn cho phép màn hình bản đồ của Google tắt tính năng cuộn dựa trên kích thước màn hình. Phần duy nhất tôi gặp khó khăn là viết mã tự động thay đổi giá trị Đúng/Sai khi tôi thay đổi kích thước màn hình theo cách thủ công. Đây là trang web mà tôi đã làm theo hướng dẫn nhưng
Tôi có một lớp "FileButton". Mục đích của nó là liên kết các tập tin với JButton, từ đó FileButton kế thừa. Các lớp con kế thừa từ điều này để thực hiện những việc hữu ích với các tệp được liên kết với các nút. JingleThẻMông
Mảng bạn bè của tôi chỉ trả về một số thay vì tất cả các số. ($myfriends = 3) sẽ là... ($myfriends = 3 5 7 8 9 12). Nếu tôi đặt nó vào một vòng lặp while... thì toàn bộ.
Câu hỏi này đã có câu trả lời ở đây: Có cách giải quyết nào để tạo các lớp CSS có tên bắt đầu bằng số hợp lệ không?
Tôi đang tạo một hàm JavaScript tự động thay đổi kích thước div thành cùng chiều rộng/chiều cao với cửa sổ khi cửa sổ được thay đổi kích thước. Chức năng này rất cơ bản nhưng tôi nhận thấy độ trễ "vẽ" đáng chú ý khi thay đổi kích thước cửa sổ. Trong JS fi
Hình ảnh cơ bản của vấn đề này có sẵn tại http://sevenx.de/demo/bootstrap-carousel/inc.carousel/tabbed-slider.html. - Nếu cậu muốn xem qua.
Tôi hiểu rằng nếu tôi muốn trả về một chuỗi ký tự hoặc một mảng từ một hàm, tôi nên khai báo nó là tĩnh để nội dung không bị "chết" khi hàm được gọi được trả về. Nhưng câu hỏi của tôi là, điều gì xảy ra khi tôi sử dụng malloc bên trong một hàm để phân bổ bộ nhớ? dưới
Trường dữ liệu nào phù hợp nhất (ít tốn kém nhất để đọc dữ liệu) để lưu trữ các giá trị đúng/sai/1/0 trong cơ sở dữ liệu mySQL? Tôi đã từng sử dụng một ký tự rất nhỏ trước đây nhưng tôi không chắc liệu đó có phải là giải pháp tốt nhất không? Cảm ơn bạn!
Tôi muốn đọc và xử lý từng mục trong hàng đầu tiên của tệp CSV (ví dụ: in). Tôi giả sử các dòng mới \n kiểu Unix được sử dụng, không có mục nào dài hơn 255 ký tự và (bây giờ) có một dòng mới trước EOF. Điều này có nghĩa là fgets() theo sau là strto
Vì vậy, tất cả chúng ta đều biết quy tắc so sánh có dấu/không dấu của C/C++ là -1 > 2u == true và tôi gặp tình huống muốn thực hiện so sánh "chính xác" một cách hiệu quả. Câu hỏi của tôi là cách tiếp cận nào hiệu quả hơn khi càng có nhiều kiến trúc quen thuộc với mọi người càng tốt. trình diễn
**Tóm tắt:**Tiêu đề bài viết có vẻ mâu thuẫn. Bài viết này được chia sẻ từ Cộng đồng Huawei Cloud "Xử lý ngoại lệ Java: Cách viết chương trình "đúng" nhưng trình biên dịch lại coi là có lỗi ngữ pháp" của Jerry Wang. Tiêu đề của bài viết có thể có vẻ mâu thuẫn, nhưng tôi
Tôi có một khung dữ liệu trông giống như: dataDemo % mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) # POS REF
Có ai có thể giúp tôi định dạng lại/định dạng đúng cách tệp văn bản được phân tách bằng VBScript không? Tôi có một tệp văn bản^ được phân tách như sau: AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^A
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc kiến thức chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập trang
Tôi là một lập trình viên xuất sắc, rất giỏi!