Hướng dẫn recursive for loop python - đệ quy cho vòng lặp python
Trong hướng dẫn này, bạn sẽ học cách tạo một hàm đệ quy (một hàm tự gọi). Show
Nội dung chính
Nội phân chính
Đệ quy là gì?Chức năng đệ quy Python Ví dụ về hàm đệ quy Chức năng đệ quy PythonVí dụ về hàm đệ quy Ưu điểm của đệ quy Nhược điểm của đệ quyKính gửi ông già Noel Pythonic Các chức năng đệ quy trong Python Ví dụ về hàm đệ quy
Ưu điểm của đệ quy The factorial of 3 is 6 Nhược điểm của đệ quy Kính gửi ông già Noel Pythonic Các chức năng đệ quy trong Python factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call Duy trì trạng thái Cấu trúc dữ liệu đệ quy trong PythonĐệ quy ngây thơ là ngây thơ Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là một người trang trí lưu trữ kết quả. Do đó, chúng tôi tránh được tính toán lại bằng cách kiểm tra rõ ràng giá trị trước khi cố gắng tính toán nó. Một điều cần lưu ý về Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là vì nó sử dụng từ điển để kết quả bộ đệm, các đối số từ khóa và vị trí (đóng vai trò là khóa trong từ điển đó) cho hàm phải được băm. Vòng lặp đệ quy là gì? Nội phân chính Chi tiết phiền phứcƯu điểm của đệ quy Traceback (most recent call last): File " Ưu điểm của đệ quy
Nhược điểm của đệ quy
Cấu trúc dữ liệu đệ quy trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Thinking Recursively in Python Vòng lặp đệ quy là gì? Nội phân chính Chi tiết phiền phức Kính gửi ông già Noel PythonicCác chức năng đệ quy trong Python Duy trì trạng thái Cấu trúc dữ liệu đệ quy trong Python
Đệ quy ngây thơ là ngây thơ
Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là một người trang trí lưu trữ kết quả. Do đó, chúng tôi tránh được tính toán lại bằng cách kiểm tra rõ ràng giá trị trước khi cố gắng tính toán nó. Một điều cần lưu ý về Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là vì nó sử dụng từ điển để kết quả bộ đệm, các đối số từ khóa và vị trí (đóng vai trò là khóa trong từ điển đó) cho hàm phải được băm.
Vòng lặp đệ quy là gì? Thuật toán phân phối hiện tại đệ quy được thực hiện trong Python:
>>>
Các chức năng đệ quy trong PythonBây giờ chúng ta có một số trực giác về đệ quy, hãy để giới thiệu định nghĩa chính thức của một hàm đệ quy. Một hàm đệ quy là một hàm được xác định theo bản thân thông qua các biểu thức tự tham chiếu. Điều này có nghĩa là chức năng sẽ tiếp tục tự gọi và lặp lại hành vi của nó cho đến khi một số điều kiện được đáp ứng để trả về kết quả. Tất cả các chức năng đệ quy chia sẻ một cấu trúc chung được tạo thành từ hai phần: trường hợp cơ sở và trường hợp đệ quy. Để chứng minh cấu trúc này, hãy để Viết một hàm đệ quy để tính toán 5:
Ở đây, 6 là trường hợp cơ sở của chúng tôi và nó bằng 7.Hàm đệ quy để tính toán 5 được triển khai trong Python:The factorial of 3 is 61 >>> The factorial of 3 is 62 Đằng sau hậu trường, mỗi cuộc gọi đệ quy thêm một khung ngăn xếp (chứa bối cảnh thực thi của nó) vào ngăn xếp cuộc gọi cho đến khi chúng tôi đạt đến trường hợp cơ sở. Sau đó, ngăn xếp bắt đầu thư giãn khi mỗi cuộc gọi trả về kết quả của nó: Duy trì trạng tháiKhi xử lý các chức năng đệ quy, hãy nhớ rằng mỗi cuộc gọi đệ quy đều có bối cảnh thực thi riêng, vì vậy để duy trì trạng thái trong quá trình đệ quy, bạn phải:
Một cuộc biểu tình nên làm cho mọi thứ rõ ràng hơn. Hãy để tính toán 9 bằng cách sử dụng đệ quy. Trạng thái mà chúng tôi phải duy trì là (số hiện tại chúng tôi đang thêm, tổng tích lũy cho đến bây giờ).Ở đây, cách bạn làm điều đó bằng cách luồn nó qua mỗi cuộc gọi đệ quy (nghĩa là chuyển trạng thái hiện tại được cập nhật cho mỗi cuộc gọi đệ quy dưới dạng đối số): The factorial of 3 is 63 >>> The factorial of 3 is 64 Ở đây, cách bạn duy trì trạng thái bằng cách giữ nó trong phạm vi toàn cầu: The factorial of 3 is 65 >>> The factorial of 3 is 66 Tôi thích luồng nhà nước thông qua mỗi cuộc gọi đệ quy vì tôi thấy trạng thái có thể thay đổi toàn cầu là xấu xa, nhưng đó là một cuộc thảo luận sau đó. Cấu trúc dữ liệu đệ quy trong PythonMột cấu trúc dữ liệu được đệ quy nếu nó có thể được định nghĩa theo phiên bản nhỏ hơn của chính nó. Danh sách là một ví dụ về cấu trúc dữ liệu đệ quy. Hãy để tôi chứng minh. Giả sử rằng bạn chỉ có một danh sách trống theo ý của bạn và thao tác duy nhất bạn có thể thực hiện trên đó là: The factorial of 3 is 67 Sử dụng danh sách trống và hoạt động Traceback (most recent call last): File "0, bạn có thể tạo bất kỳ danh sách nào. Ví dụ: hãy để tạo ra Traceback (most recent call last): File "1: The factorial of 3 is 68
Danh sách không phải là cấu trúc dữ liệu đệ quy duy nhất. Các ví dụ khác bao gồm đặt, cây, từ điển, v.v. Cấu trúc dữ liệu đệ quy và các chức năng đệ quy đi cùng nhau như bánh mì và bơ. Cấu trúc chức năng đệ quy thường có thể được mô hình hóa theo định nghĩa của cấu trúc dữ liệu đệ quy mà nó lấy làm đầu vào. Hãy để tôi chứng minh điều này bằng cách tính tổng của tất cả các yếu tố của danh sách một cách đệ quy: factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call0 >>> factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call1 Đệ quy ngây thơ là ngây thơCác số Fibonacci ban đầu được định nghĩa bởi nhà toán học người Ý Fibonacci trong thế kỷ thứ mười ba để mô hình hóa sự phát triển của quần thể thỏ. Fibonacci phỏng đoán rằng số lượng con thỏ sinh ra trong một năm nhất định bằng với số lượng con thỏ được sinh ra ở mỗi năm trước, bắt đầu từ một cặp thỏ trong năm đầu tiên. Để đếm số lượng thỏ được sinh ra vào năm thứ n, ông đã xác định mối quan hệ tái phát: factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call2 Các trường hợp cơ sở là: factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call3 Hãy để viết một chức năng đệ quy để tính toán số Fibonacci thứ n: factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call4 >>> factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call5 Tranh tính sau khi định nghĩa đệ quy của số Fibonacci thứ n khá không hiệu quả. Như bạn có thể thấy từ đầu ra ở trên, chúng tôi được tính toán lại các giá trị không cần thiết. Hãy cùng cố gắng cải thiện Traceback (most recent call last): File "5 bằng cách lưu trữ kết quả của mỗi tính toán FIBONACCI FK: factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call6 >>> factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call7 Tranh tính sau khi định nghĩa đệ quy của số Fibonacci thứ n khá không hiệu quả. Như bạn có thể thấy từ đầu ra ở trên, chúng tôi được tính toán lại các giá trị không cần thiết. Hãy cùng cố gắng cải thiện Traceback (most recent call last): File "5 bằng cách lưu trữ kết quả của mỗi tính toán FIBONACCI FK: Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là một người trang trí lưu trữ kết quả. Do đó, chúng tôi tránh được tính toán lại bằng cách kiểm tra rõ ràng giá trị trước khi cố gắng tính toán nó. Một điều cần lưu ý về Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là vì nó sử dụng từ điển để kết quả bộ đệm, các đối số từ khóa và vị trí (đóng vai trò là khóa trong từ điển đó) cho hàm phải được băm.Chi tiết phiền phức >>> factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call8 Tranh tính sau khi định nghĩa đệ quy của số Fibonacci thứ n khá không hiệu quả. Như bạn có thể thấy từ đầu ra ở trên, chúng tôi được tính toán lại các giá trị không cần thiết. Hãy cùng cố gắng cải thiện Traceback (most recent call last): File "5 bằng cách lưu trữ kết quả của mỗi tính toán FIBONACCI FK: >>> factorial(3) # 1st call with 3 3 * factorial(2) # 2nd call with 2 3 * 2 * factorial(1) # 3rd call with 1 3 * 2 * 1 # return from 3rd call as number=1 3 * 2 # return from 2nd call 6 # return from 1st call9 Tranh tính sau khi định nghĩa đệ quy của số Fibonacci thứ n khá không hiệu quả. Như bạn có thể thấy từ đầu ra ở trên, chúng tôi được tính toán lại các giá trị không cần thiết. Hãy cùng cố gắng cải thiện Traceback (most recent call last): File "5 bằng cách lưu trữ kết quả của mỗi tính toán FIBONACCI FK: Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là một người trang trí lưu trữ kết quả. Do đó, chúng tôi tránh được tính toán lại bằng cách kiểm tra rõ ràng giá trị trước khi cố gắng tính toán nó. Một điều cần lưu ý về Traceback (most recent call last): File "", line 3, in File "", line 2, in a File "", line 2, in a File "", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded6 là vì nó sử dụng từ điển để kết quả bộ đệm, các đối số từ khóa và vị trí (đóng vai trò là khóa trong từ điển đó) cho hàm phải được băm.Chi tiết phiền phức Traceback (most recent call last):
File " |