Hướng dẫn recursive while loop python - đệ quy trong khi 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].

Nội dung chính

  • Đệ quy là gì?
  • Chức năng đệ quy Python
  • Ví dụ về hàm đệ quy
  • Ưu điểm của đệ quy
  • Nhược điểm của đệ quy
  • Kính gửi ông già Noel Pythonic
  • Cá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.
  • 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.
  • Python không có hỗ trợ cho việc loại bỏ cuộc gọi đuôi. Kết quả là, bạn có thể gây ra tràn ngăn xếp nếu cuối cùng bạn sử dụng nhiều khung ngăn xếp hơn độ sâu ngăn xếp cuộc gọi mặc định:
  • Suy nghĩ đệ quy
  • Các khái niệm, kỹ thuật và mô hình lập trình máy tính
  • Lập trình Haskell từ các nguyên tắc đầu tiên
  • Vòng lặp đệ quy là gì?

Nội phân chính

  • Đệ quy là gì?
  • Chức năng đệ quy Python
  • Ví dụ về hàm đệ quy
  • Ưu điểm của đệ quy
  • Nhược điểm của đệ quy
  • Kính gửi ông già Noel Pythonic
  • Cá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ì?
  • Nội phân chính
  • Chi tiết phiền phức
  • Sự khác biệt giữa đệ quy và vòng lặp là gì?

Đệ quy là gì?

Chức năng đệ quy Python

Ví dụ về hàm đệ quy

Chức năng đệ quy Python

Ví dụ về hàm đệ quy

Ưu điểm của đệ quy

Nhược điểm của đệ quy

Kính gửi ông già Noel Pythonic

Các chức năng đệ quy trong Python

Ví dụ về hàm đệ quy

def factorial[x]:
    """This is a recursive function
    to find the factorial of an integer"""

    if x == 1:
        return 1
    else:
        return [x * factorial[x-1]]


num = 3
print["The factorial of", num, "is", factorial[num]]

Ư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 "", 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 exceeded

Ưu điểm của đệ quy

  1. Nhược điểm của đệ quy
  2. Kính gửi ông già Noel Pythonic
  3. Các chức năng đệ quy trong Python

Nhược điểm của đệ quy

  1. Kính gửi ông già Noel Pythonic
  2. Các chức năng đệ quy trong Python
  3. Duy trì trạng thái

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

Đệ 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

Kính gửi ông già Noel Pythonic

Các chức năng đệ quy trong Python

Duy trì trạng thái

Cấu trúc dữ liệu đệ quy trong Python

houses = ["Eric's house", "Kenny's house", "Kyle's house", "Stan's house"]

def deliver_presents_iteratively[]:
    for house in houses:
        print["Delivering presents to", house]

Đệ quy ngây thơ là ngây thơ

>>> deliver_presents_iteratively[]
Delivering presents to Eric's house
Delivering presents to Kenny's house
Delivering presents to Kyle's house
Delivering presents to Stan's house

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.

  1. Python không có hỗ trợ cho việc loại bỏ cuộc gọi đuôi. Kết quả là, bạn có thể gây ra tràn ngăn xếp nếu cuối cùng bạn sử dụng nhiều khung ngăn xếp hơn độ sâu ngăn xếp cuộc gọi mặc định:
  2. Suy nghĩ đệ quy
    • Các khái niệm, kỹ thuật và mô hình lập trình máy tính
    • Lập trình Haskell từ các nguyên tắc đầu tiên

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:

houses = ["Eric's house", "Kenny's house", "Kyle's house", "Stan's house"]

# Each function call represents an elf doing his work 
def deliver_presents_recursively[houses]:
    # Worker elf doing his work
    if len[houses] == 1:
        house = houses[0]
        print["Delivering presents to", house]

    # Manager elf doing his work
    else:
        mid = len[houses] // 2
        first_half = houses[:mid]
        second_half = houses[mid:]

        # Divides his work among two elves
        deliver_presents_recursively[first_half]
        deliver_presents_recursively[second_half]

>>>

>>> deliver_presents_recursively[houses]
Delivering presents to Eric's house
Delivering presents to Kenny's house
Delivering presents to Kyle's house
Delivering presents to Stan's house

Các chức năng đệ quy trong Python

Bâ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

def recursor[]:
    recursor[]
recursor[]
5:
  1. Phân tách vấn đề ban đầu thành các trường hợp đơn giản hơn của cùng một vấn đề. Đây là trường hợp đệ quy:

    The factorial of 3 is 6
    1
  2. Vì vấn đề lớn được chia thành những vấn đề ít phức tạp hơn, những vấn đề phụ đó cuối cùng phải trở nên đơn giản đến mức chúng có thể được giải quyết mà không cần phân khu. Đây là trường hợp cơ sở:

    The factorial of 3 is 6
    0

Ở đây,

def recursor[]:
    recursor[]
recursor[]
6 là trường hợp cơ sở của chúng tôi và nó bằng
def recursor[]:
    recursor[]
recursor[]
7.

Hàm đệ quy để tính toán

def recursor[]:
    recursor[]
recursor[]
5 được triển khai trong Python:
The factorial of 3 is 6
1

>>>

The factorial of 3 is 6
2

Đằ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ái

Khi 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:

  • Chủ đề trạng thái thông qua mỗi cuộc gọi đệ quy để trạng thái hiện tại là một phần của bối cảnh thực hiện cuộc gọi hiện tại
  • Giữ nhà nước trong phạm vi toàn cầu

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

def recursor[]:
    recursor[]
recursor[]
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 6
3

>>>

The factorial of 3 is 6
4

Ở đâ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 6
5

>>>

The factorial of 3 is 6
6

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 Python

Mộ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 6
7

Sử dụng danh sách trống và hoạt động

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 exceeded
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 "", 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 exceeded
1:
The factorial of 3 is 6
8
  1. Bắt đầu với một danh sách trống, bạn có thể tạo bất kỳ danh sách nào bằng cách áp dụng chức năng

    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 exceeded
    0 và do đó cấu trúc dữ liệu danh sách có thể được định nghĩa là:
    The factorial of 3 is 6
    9
  2. Đệ quy cũng có thể được coi là thành phần chức năng tự tham chiếu. Chúng tôi áp dụng một hàm cho một đối số, sau đó chuyển kết quả đó là một đối số cho một ứng dụng thứ hai của cùng một hàm, v.v. Liên tục sáng tác

    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 exceeded
    0 với chính nó giống như
    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 exceeded
    0 tự gọi nhiều lần.

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 call
0

>>>

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
1

Đệ 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 call
2

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 call
3

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 call
4

>>>

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
5

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 "", 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 exceeded
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 call
6

>>>

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
7

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 "", 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 exceeded
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 call
8

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 "", 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 exceeded
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 call
9

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 "", 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 exceeded
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 "", 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 exceeded
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 exceeded
6 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 exceeded
6 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.

  1. Python không có hỗ trợ cho việc loại bỏ cuộc gọi đuôi. Kết quả là, bạn có thể gây ra tràn ngăn xếp nếu cuối cùng bạn sử dụng nhiều khung ngăn xếp hơn độ sâu ngăn xếp cuộc gọi mặc định:
  2. Hãy ghi nhớ giới hạn này nếu bạn có một chương trình yêu cầu đệ quy sâu.
  3. Ngoài ra, các cấu trúc dữ liệu có thể thay đổi của Python, don don hỗ trợ chia sẻ cấu trúc, vì vậy việc đối xử với chúng như các cấu trúc dữ liệu bất biến sẽ ảnh hưởng tiêu cực đến không gian và hiệu quả GC của bạn [thu gom rác] vì bạn sẽ sao chép không cần thiết nhiều đối tượng có thể thay đổi. Ví dụ, tôi đã sử dụng mẫu này để phân tách danh sách và tái diễn trên chúng:
  4. Tôi đã làm điều đó để đơn giản hóa mọi thứ vì sự rõ ràng. Hãy nhớ rằng đuôi đang được tạo ra bằng cách sao chép. Làm đệ quy điều đó trên các danh sách lớn có thể ảnh hưởng tiêu cực đến không gian và hiệu quả của GC của bạn.
  5. Vây

Tôi đã từng được yêu cầu giải thích đệ quy trong một cuộc phỏng vấn. Tôi lấy một tờ giấy và viết

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 exceeded
8 ở cả hai bên. Người phỏng vấn đã không nhận được trò đùa, nhưng bây giờ bạn đã đọc bài viết này, hy vọng bạn sẽ làm 🙂 Happy Pythoning! 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

Người giới thiệu 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

Suy nghĩ đệ quya special type of looping construct where a particular entity tries to invoke itself from within its loop code. Thus the entity keeps calling itself until a specific condition or break is specified.

Các sơ đồ nhỏa special type of looping construct where a particular entity tries to invoke itself from within its loop code. Thus the entity keeps calling itself until a specific condition or break is specified.

Các khái niệm, kỹ thuật và mô hình lập trình máy tính

Hướng dẫn thiết kế thuật toán

Lập trình Haskell từ các nguyên tắc đầu tiênloops are stored in dynamic memory, where variables can be created indefinitely.

Vòng lặp đệ quy là gì?

Một vòng lặp đệ quy là một loại cấu trúc vòng lặp đặc biệt trong đó một thực thể cụ thể cố gắng tự gọi từ trong mã vòng lặp của nó. Do đó, thực thể tiếp tục tự gọi cho đến khi một điều kiện hoặc ngắt cụ thể được chỉ định.computing factorials. The factorial of a number is computed as that number times all of the numbers below it up to and including 1. For example, factorial[5] is the same as 5*4*3*2*1 , and factorial[3] is 3*2*1 .computing factorials. The factorial of a number is computed as that number times all of the numbers below it up to and including 1. For example, factorial[5] is the same as 5*4*3*2*1 , and factorial[3] is 3*2*1 .

Bài Viết Liên Quan

Chủ Đề