Danh sách đệ quy python

Đệ quy là một mảng kiến ​​thức nâng cao, ở Python thì nó không thường xuyên được sử dụng đến, do cách xử lý lí trí của Python có thể sử dụng các cấu trúc vòng lặp đơn giản mà không cần sử dụng tới đệ quy. Nhưng dù sao thì đây cũng là một kỹ thuật khá hữu dụng mà bạn đọc nên biết. Nó cũng chỉ đơn giản là công việc chính nó gọi nó

Lấy một ví dụ cụ thể. Giả sử ta có một danh sách bao gồm các phần tử, nhiệm vụ của chúng ta là lấy toàn bộ các phần tử của danh sách đó

Để giải bài toán này, ta có thể sử dụng một hàm put. help lấy ra một phần tử trong danh sách, đồng thời tìm kiếm xem danh sách có trống hay không. Nếu danh sách đó vẫn còn phần tử, thì ta gọi lại hàm đặt thêm một lần nữa (để tiếp tục lấy và kiểm tra). Làm như thế cho đến khi danh sách trống

Bản thân công việc gọi một chức năng trong chính nó được gọi là đệ quy. Trong trường hợp trên, đệ quy là việc khi ta đang chạy hàm put mà gọi lại hàm đó tiếp (danh sách trường hợp có nhiều phần tử)

Minh họa đệ quy bằng cách tính tổng

Ta sẽ tính tổng các phần tử của một danh sách (hoặc một dãy bất kỳ) bằng cách sử dụng đệ quy (Ví dụ này chỉ mang tính minh họa, thực tế khi làm bạn nên sử dụng hàm tổng)

>>> def cal_sum(lst): .. if not lst: # tương đương if len(lst) == 0: .. return 0 .. else: .. return lst[0] + cal_sum(lst[1:]) ... >>> cal_sum([1, 2, 3, 4]) 10 >>> cal_sum([1, 2, 3, 4, 5]) 15

Ở ví dụ trên, ta liên tục gọi lại hàm cal_sum với đối số là phần còn lại của Danh sách tính từ chỉ mục 1. Ở mỗi lần gọi hàm, ta để lại giá trị chỉ mục 0 trong Danh sách để khi trong Danh sách không còn phần tử nào ta sẽ trả về số 0 để kết thúc đệ quy

Nếu bạn thấy vẫn còn chưa hiểu rõ thì cũng đừng lắng nghe, ai cũng cảm thấy khó hiểu và điều này thường xuyên xảy ra với những bạn mới học cũng vậy. Những lúc như thế này, bạn nên thêm một hàm print để xem cụ thể là chuyện gì xảy ra.

>>> def cal_sum(lst): .. print(lst) .. if not lst: .. return 0 .. else: .. return lst[0] + cal_sum(lst[1:]) ... >>> cal_sum([1, 2, 3, 4]) [1, 2, 3, 4] [2, 3, 4] [3, 4] [4] [] 10

Nếu bạn vẫn còn khó hiểu hãy vẽ ra giấy. Đây là cách mà mình đã làm

Đệ quy theo phong cách Python

Bạn còn nhớ cú pháp if/else trong lambda không? . You can apply to use it to đệ quy

>>> def cal_sum(lst): .. return 0 if not lst else lst[0] + cal_sum(lst[1:]) ... >>> cal_sum([1, 2, 3]) 6

Giả sử một danh sách có n phần tử thì với đệ quy như trên cần phải có n + 1 lần return, ta có thể giảm xuống còn n lần return bằng cách

>>> def cal_sum(lst): .. return lst[0] if len(lst) == 1 else lst[0] + cal_sum(lst[1:]) ... >>> cal_sum([1, 2, 3]) 6

Lưu ý. cách này không được sử dụng trong trường hợp container rỗng

Hoặc ta có thể sử dụng đối số đóng gói

>>> def cal_sum(lst): .. idx0, *r = lst # idx0, r = lst[0], lst[1:] .. return idx0 if not r else idx0 + cal_sum(r) ... >>> cal_sum([1, 2, 3]) 6

Lưu ý. cách này cũng không được sử dụng khi vùng chứa rỗng. Tuy nhiên, lợi ích của nó cũng như cách vừa phải là ta có thể cộng không chỉ số mà là chuỗi hoặc danh sách

>>> cal_sum(['a', 'b', 'c']) 'abc' >>> cal_sum([[1, 2], [3, 4], [5, 6]]) [1, 2, 3, 4, 5, 6]

Đệ quy cũng có thể chuyển hướng. Please view ví dụ sau. Một hàm gọi một hàm khác, sau đó gọi lại hàm đã gọi nó

>>> def cal_sum(lst): .. if not lst: return 0 .. return call_cal_sum(lst) ... >>> def call_cal_sum(lst): .. return lst[0] + cal_sum(lst[1:]) ... >>> cal_sum([1, 2, 3, 4, 5]) 15

Quy định và vòng lặp

Ở những ví dụ trước, nếu phải chọn vòng lặp hay là đệ quy để xử lý lí do thì Kteam khuyên bạn đọc nên chọn vòng lặp. Python chú trọng việc làm đơn giản hóa mọi công việc như một vòng lặp vì nó theo một cách bình thường đơn giản. Vòng lặp cũng không yêu cầu bạn phải tạo ra một hàm mới có thể sử dụng được. Và thêm nữa, đệ quy còn thua vòng lặp ở mặt hiệu quả về bộ nhớ và thời gian thực hiện

Kết luận

Qua bài viết này, bạn đã biết thêm về đệ quy. Ngoài ra, bạn cũng đã nắm bắt được khá nhiều kiến ​​thức cơ bản của Python thông qua khóa LẬP TRÌNH PYTHON CƠ BẢN. Hy vọng từ khóa học sẽ là nền tảng tốt để bạn có thể tiếp tục tự nghiên cứu hoặc tiến tới các khóa học Python khác

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc đóng góp ý kiến ​​của mình để phát triển bài viết tốt hơn. Don't say “Luyện tập – Thử thần – Không sợ khó”

Thảo luận

Nếu bạn gặp bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam. com to get the support from the community

Chủ đề