Hướng dẫn what is recursive fibonacci in python? - fibonacci đệ quy trong python là gì?

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Khám phá chuỗi Fibonacci với 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: Exploring the Fibonacci Sequence With Python

Trình tự Fibonacci là một chuỗi số nguyên khá nổi tiếng. Trình tự xuất hiện tự nhiên trong nhiều vấn đề và có một định nghĩa đệ quy tốt đẹp. Học cách tạo ra nó là một bước thiết yếu trong hành trình lập trình viên thực dụng hướng tới việc làm chủ đệ quy. Trong hướng dẫn này, bạn sẽ tập trung vào việc tìm hiểu trình tự Fibonacci là gì và làm thế nào để tạo nó bằng cách sử dụng Python.Fibonacci sequence is a pretty famous sequence of integer numbers. The sequence comes up naturally in many problems and has a nice recursive definition. Learning how to generate it is an essential step in the pragmatic programmer’s journey toward mastering recursion. In this tutorial, you’ll focus on learning what the Fibonacci sequence is and how to generate it using Python.

Trong hướng dẫn này, bạn sẽ học cách:

  • Tạo chuỗi Fibonacci bằng thuật toán đệ quyrecursive algorithm
  • Tối ưu hóa thuật toán Fibonacci đệ quy bằng cách sử dụng ghi nhớmemoization
  • Tạo chuỗi Fibonacci bằng thuật toán lặpiterative algorithm

Để tận dụng tối đa hướng dẫn này, bạn nên biết những điều cơ bản của ký hiệu O lớn, lập trình hướng đối tượng, các phương pháp đặc biệt của Python, các câu lệnh, chức năng và cấu trúc dữ liệu cơ bản như danh sách, hàng đợi và ngăn xếp. Có một số quen thuộc với các khái niệm này sẽ giúp bạn hiểu rất nhiều về những khái niệm mới mà bạn sẽ khám phá trong hướng dẫn này.

Hãy để lặn ngay trong!

Bắt đầu với chuỗi Fibonacci

Leonardo Fibonacci là một nhà toán học người Ý, người đã có thể nhanh chóng đưa ra câu trả lời cho câu hỏi này được Hoàng đế Frederick II của Swabia hỏi: Có bao nhiêu cặp thỏ được lấy trong một năm, không bao gồm các trường hợp tử vong, giả sử mỗi cặp vợ chồng sinh ra Cặp đôi mỗi tháng và rằng các cặp vợ chồng trẻ nhất có thể sinh sản vào tháng thứ hai của cuộc đời?

Câu trả lời là trình tự sau:

Mẫu bắt đầu sau hai số đầu tiên, 0 và 1, trong đó mỗi số trong chuỗi luôn là tổng của hai số trước nó. Các nhà toán học Ấn Độ đã biết về chuỗi này từ thế kỷ thứ sáu, và Fibonacci đã tận dụng nó để tính toán sự tăng trưởng của quần thể thỏ.

F [n] được sử dụng để chỉ ra số lượng cặp thỏ có trong tháng N, do đó trình tự có thể được thể hiện như thế này:

Trong thuật ngữ toán học, bạn gọi đây là mối quan hệ tái phát, có nghĩa là mỗi thuật ngữ của chuỗi [ngoài 0 và 1] là một hàm của các thuật ngữ trước.

Ngoài ra, còn có một phiên bản của chuỗi trong đó hai số đầu tiên là cả 1, như vậy:

Trong phiên bản thay thế này, F [0] vẫn ngầm là 0, nhưng bạn bắt đầu từ F [1] và F [2] thay thế. Thuật toán vẫn giữ nguyên vì bạn luôn luôn tổng kết hai số trước để có được số tiếp theo trong chuỗi.

Đối với các mục đích của hướng dẫn này, bạn sẽ sử dụng phiên bản của chuỗi bắt đầu bằng 0.

Kiểm tra đệ quy phía sau chuỗi Fibonacci

Tạo chuỗi Fibonacci là một vấn đề đệ quy cổ điển. Đệ quy là khi một chức năng đề cập đến chính nó để phá vỡ vấn đề mà nó đang cố gắng giải quyết. Trong mọi cuộc gọi chức năng, vấn đề trở nên nhỏ hơn cho đến khi nó đạt đến một trường hợp cơ sở, sau đó nó sẽ trả lại kết quả cho mỗi người gọi trung gian cho đến khi nó trả lại kết quả cuối cùng trở lại người gọi ban đầu.Recursion is when a function refers to itself to break down the problem it’s trying to solve. In every function call, the problem becomes smaller until it reaches a base case, after which it will then return the result to each intermediate caller until it returns the final result back to the original caller.

Nếu bạn muốn tính toán số F [5] F [5], bạn cần phải tính toán người tiền nhiệm của nó, F [4] và F [3], trước tiên. Và để tính toán F [4] và F [3], bạn sẽ cần phải tính toán người tiền nhiệm của họ. Sự cố của F [5] thành các vấn đề nhỏ hơn sẽ trông như thế này:

Mỗi lần chức năng Fibonacci được gọi, nó sẽ được chia thành hai vấn đề nhỏ hơn bởi vì đó là cách mà bạn xác định mối quan hệ tái phát. Khi nó đạt đến trường hợp cơ sở của F [0] hoặc F [1], cuối cùng nó cũng có thể trả lại kết quả cho người gọi của nó.

Để tính toán số thứ năm trong chuỗi Fibonacci, bạn giải quyết các vấn đề nhỏ hơn nhưng giống hệt nhau cho đến khi bạn đạt được các trường hợp cơ sở, nơi bạn có thể bắt đầu trả về kết quả:

Các vấn đề phụ màu trên sơ đồ này đại diện cho các giải pháp lặp đi lặp lại cho cùng một vấn đề. Nếu bạn đi xa hơn trên cây, bạn sẽ tìm thấy nhiều giải pháp lặp đi lặp lại này. Điều này có nghĩa là để tạo ra một chuỗi Fibonacci một cách đệ quy, bạn phải tính toán nhiều số trung gian nhiều lần. Đây là một trong những vấn đề cơ bản trong cách tiếp cận đệ quy đối với chuỗi Fibonacci.

Tạo ra chuỗi Fibonacci đệ quy trong Python

Thuật toán phổ biến và tối thiểu nhất để tạo chuỗi Fibonacci yêu cầu bạn mã hóa một hàm đệ quy tự gọi là nhiều lần khi cần thiết cho đến khi nó tính toán số Fibonacci mong muốn:

>>>

>>> def fibonacci_of[n]:
...     if n in {0, 1}:  # Base case
...         return n
...     return fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

Bên trong fibonacci_of[], trước tiên bạn kiểm tra trường hợp cơ sở. Sau đó, bạn trả về tổng của các giá trị kết quả từ việc gọi hàm với hai giá trị trước là n. Danh sách hiểu biết ở cuối ví dụ tạo ra chuỗi Fibonacci với mười lăm số đầu tiên.

Chức năng này nhanh chóng rơi vào vấn đề lặp lại mà bạn đã thấy trong phần trên. Việc tính toán ngày càng đắt hơn khi n trở nên lớn hơn. Thời gian cần thiết tăng theo cấp số nhân vì hàm tính toán nhiều vấn đề phụ giống hệt nhau nhiều lần.

Để tính f [5], fibonacci_of[] phải tự gọi mình là mười lăm lần. Để tính toán f [n], độ sâu tối đa của cây cuộc gọi là n và vì mỗi cuộc gọi hàm tạo ra hai cuộc gọi hàm bổ sung, độ phức tạp của hàm đệ quy này là O [2N].

Hầu hết các cuộc gọi đó đều dư thừa vì bạn đã tính toán kết quả của họ. F [3] xuất hiện hai lần và F [2] xuất hiện ba lần. F [1] và F [0] là các trường hợp cơ sở, vì vậy, nó tốt để gọi chúng nhiều lần. Bạn có thể muốn tránh sự lặp lại lãng phí này, đó là chủ đề của các phần sau.

Tối ưu hóa thuật toán đệ quy cho chuỗi Fibonacci

Có ít nhất hai kỹ thuật bạn có thể sử dụng để tạo thuật toán để tạo chuỗi Fibonacci hiệu quả hơn, nói cách khác, để mất ít thời gian hơn để tính toán. Những kỹ thuật này đảm bảo rằng bạn không liên tục tính toán các giá trị giống nhau nhiều lần, đó là điều làm cho thuật toán ban đầu trở nên không hiệu quả. Họ gọi là ghi nhớ và lặp lại.

Ghi nhớ thuật toán đệ quy

Như bạn đã thấy trong mã trên, hàm Fibonacci tự gọi mình nhiều lần với cùng một đầu vào. Thay vì một cuộc gọi mới mỗi lần, bạn có thể lưu trữ kết quả của các cuộc gọi trước đó trong một cái gì đó như bộ nhớ bộ nhớ. Bạn có thể sử dụng danh sách Python để lưu trữ kết quả của các tính toán trước đó. Kỹ thuật này được gọi là ghi nhớ.memoization.

Ghi nhớ tăng tốc độ thực hiện các hàm đệ quy đắt tiền bằng cách lưu trữ kết quả được tính toán trước đó trong bộ đệm. Bằng cách này, khi cùng một đầu vào xảy ra một lần nữa, chức năng chỉ cần tra cứu kết quả tương ứng và trả về nó mà không phải chạy lại tính toán. Bạn có thể tham khảo những kết quả này là bộ nhớ cache hoặc ghi nhớ:cached or memoized:

Với ghi nhớ, bạn chỉ cần đi qua cây cuộc gọi có độ sâu n một lần sau khi trở về từ trường hợp cơ sở, khi bạn lấy tất cả các giá trị được tính toán trước đó được tô màu vàng, F [2] và F [3], từ bộ đệm trước đó.

Đường dẫn màu cam cho thấy rằng không có đầu vào cho hàm fibonacci được gọi là nhiều lần. Điều này làm giảm đáng kể độ phức tạp thời gian của thuật toán từ O [2N] theo cấp số nhân đến tuyến tính O [N].

Ngay cả đối với các trường hợp cơ sở, bạn có thể thay thế gọi F [0] và F [1] chỉ bằng cách truy xuất các giá trị trực tiếp từ bộ đệm tại các chỉ số 0 và 1, vì vậy bạn sẽ gọi hàm chỉ sáu lần thay vì mười lăm!

Ở đây, một bản dịch có thể có của tối ưu hóa này sang mã Python:

>>>

>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

Trong ví dụ này, bạn sử dụng từ điển Python để lưu trữ các số Fibonacci được tính toán. Ban đầu,

>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
0 chứa các giá trị bắt đầu của chuỗi Fibonacci, 0 và 1. Bên trong hàm, trước tiên bạn kiểm tra xem số Fibonacci cho giá trị đầu vào hiện tại của n đã có trong ____10. Nếu vậy, sau đó bạn trả lại số trong tay.

Nếu không có số Fibonacci cho giá trị hiện tại là n, thì bạn tính toán nó bằng cách gọi fibonacci_of[] đệ quy và cập nhật ____10. Bước cuối cùng là trả về số Fibonacci được yêu cầu.

Khám phá một thuật toán lặp

Điều gì sẽ xảy ra nếu bạn không cần phải gọi chức năng Fibonacci đệ quy thì sao? Bạn thực sự có thể sử dụng một thuật toán lặp để tính toán số tại vị trí n trong chuỗi Fibonacci.

Bạn biết rằng hai số đầu tiên trong chuỗi là 0 và 1 và mỗi số tiếp theo trong chuỗi là tổng của hai người tiền nhiệm trước đó. Vì vậy, bạn chỉ có thể tạo một vòng lặp thêm hai số trước đó,

>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
7 và
>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
8, cùng nhau tìm số tại vị trí n trong chuỗi.

Các số màu tím đậm trong sơ đồ dưới đây thể hiện các số mới cần được tính toán và thêm vào

>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
0 trong mỗi bước lặp lại:

Để tính toán số Fibonacci tại vị trí n, bạn lưu trữ hai số đầu tiên của chuỗi, 0 và 1, trong

>>> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
0. Sau đó, tính toán các số tiếp theo liên tiếp cho đến khi bạn có thể trả lại
 1# fibonacci_class.py
 2
 3class Fibonacci:
 4    def __init__[self]:
 5        self.cache = [0, 1]
 6
 7    def __call__[self, n]:
 8        # Validate the value of n
 9        if not [isinstance[n, int] and n >= 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n >> cache = {0: 0, 1: 1}

>>> def fibonacci_of[n]:
...     if n in cache:  # Base case
...         return cache[n]
...     # Compute and cache the Fibonacci number
...     cache[n] = fibonacci_of[n - 1] + fibonacci_of[n - 2]  # Recursive case
...     return cache[n]

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
0 là một đối tượng hoàn toàn riêng biệt, vì vậy bạn không có quyền kiểm soát nó.

Dưới đây là mã thực hiện giải pháp dựa trên lớp của bạn:

 1# fibonacci_class.py
 2
 3class Fibonacci:
 4    def __init__[self]:
 5        self.cache = [0, 1]
 6
 7    def __call__[self, n]:
 8        # Validate the value of n
 9        if not [isinstance[n, int] and n >= 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n = 0]:
10            raise ValueError[f'Positive integer number expected, got "{n}"']
11
12        # Check for computed Fibonacci numbers
13        if n >> from fibonacci_class import Fibonacci

>>> fibonacci_of = Fibonacci[]

>>> fibonacci_of[5]
5
>>> fibonacci_of[6]
8
>>> fibonacci_of[7]
13

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
3. validate the value of n by using a conditional statement. If n is not a positive integer number, then the method raises a
>>> from fibonacci_class import Fibonacci

>>> fibonacci_of = Fibonacci[]

>>> fibonacci_of[5]
5
>>> fibonacci_of[6]
8
>>> fibonacci_of[7]
13

>>> [fibonacci_of[n] for n in range[15]]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
3.

  • Dòng 13 xác định một câu lệnh có điều kiện để kiểm tra các số Fibonacci đã được tính toán và có sẵn trong

     1# fibonacci_class.py
     2
     3class Fibonacci:
     4    def __init__[self]:
     5        self.cache = [0, 1]
     6
     7    def __call__[self, n]:
     8        # Validate the value of n
     9        if not [isinstance[n, int] and n >= 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n >> from fibonacci_class import Fibonacci
    
    >>> fibonacci_of = Fibonacci[]
    
    >>> fibonacci_of[5]
    5
    >>> fibonacci_of[6]
    8
    >>> fibonacci_of[7]
    13
    
    >>> [fibonacci_of[n] for n in range[15]]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    
    8. Sau đó chạy mã này trong vỏ tương tác của bạn:

    >>>

    >>> from fibonacci_class import Fibonacci
    
    >>> fibonacci_of = Fibonacci[]
    
    >>> fibonacci_of[5]
    5
    >>> fibonacci_of[6]
    8
    >>> fibonacci_of[7]
    13
    
    >>> [fibonacci_of[n] for n in range[15]]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    

    Tại đây, bạn tạo và sau đó gọi một thể hiện của lớp

     1# fibonacci_class.py
     2
     3class Fibonacci:
     4    def __init__[self]:
     5        self.cache = [0, 1]
     6
     7    def __call__[self, n]:
     8        # Validate the value of n
     9        if not [isinstance[n, int] and n >= 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
     6        raise ValueError[f'Positive integer number expected, got "{n}"']
     7
     8    # Handle the base cases
     9    if n in {0, 1}:
    10        return n
    11
    12    previous, fib_number = 0, 1
    13    for _ in range[2, n + 1]:
    14        # Compute the next Fibonacci number, remember the previous one
    15        previous, fib_number = fib_number, previous + fib_number
    16
    17    return fib_number
    
    0. Cuộc gọi đầu tiên sử dụng
     1# fibonacci_func.py
     2
     3def fibonacci_of[n]:
     4    # Validate the value of n
     5    if not [isinstance[n, int] and n >= 0]:
     6        raise ValueError[f'Positive integer number expected, got "{n}"']
     7
     8    # Handle the base cases
     9    if n in {0, 1}:
    10        return n
    11
    12    previous, fib_number = 0, 1
    13    for _ in range[2, n + 1]:
    14        # Compute the next Fibonacci number, remember the previous one
    15        previous, fib_number = fib_number, previous + fib_number
    16
    17    return fib_number
    
    1 làm đối số và trả về
     1# fibonacci_func.py
     2
     3def fibonacci_of[n]:
     4    # Validate the value of n
     5    if not [isinstance[n, int] and n >= 0]:
     6        raise ValueError[f'Positive integer number expected, got "{n}"']
     7
     8    # Handle the base cases
     9    if n in {0, 1}:
    10        return n
    11
    12    previous, fib_number = 0, 1
    13    for _ in range[2, n + 1]:
    14        # Compute the next Fibonacci number, remember the previous one
    15        previous, fib_number = fib_number, previous + fib_number
    16
    17    return fib_number
    
    1, đây là số Fibonacci thứ sáu vì bạn sử dụng các chỉ số dựa trên không.

    Việc triển khai thuật toán trình tự Fibonacci này khá hiệu quả. Khi bạn có một phiên bản của lớp, thuộc tính

     1# fibonacci_class.py
     2
     3class Fibonacci:
     4    def __init__[self]:
     5        self.cache = [0, 1]
     6
     7    def __call__[self, n]:
     8        # Validate the value of n
     9        if not [isinstance[n, int] and n >= 0]:
    10            raise ValueError[f'Positive integer number expected, got "{n}"']
    11
    12        # Check for computed Fibonacci numbers
    13        if n = 0]:
     6        raise ValueError[f'Positive integer number expected, got "{n}"']
     7
     8    # Handle the base cases
     9    if n in {0, 1}:
    10        return n
    11
    12    previous, fib_number = 0, 1
    13    for _ in range[2, n + 1]:
    14        # Compute the next Fibonacci number, remember the previous one
    15        previous, fib_number = fib_number, previous + fib_number
    16
    17    return fib_number
    

    Bây giờ, thay vì sử dụng đệ quy trong fibonacci_of[], bạn đã sử dụng phép lặp. Việc triển khai thuật toán trình tự Fibonacci này chạy trong thời gian tuyến tính O [n]. Ở đây, một sự cố của mã:

    • Dòng 3 định nghĩa fibonacci_of[], có số nguyên dương, n, làm đối số. defines fibonacci_of[], which takes a positive integer, n, as an argument.

    • Dòng 5 và 6 thực hiện xác thực thông thường của n. perform the usual validation of n.

    • Dòng 9 và 10 xử lý các trường hợp cơ sở trong đó n là 0 hoặc 1. handle the base cases where n is either 0 or 1.

    • Dòng 12 xác định hai biến cục bộ,

       1# fibonacci_func.py
       2
       3def fibonacci_of[n]:
       4    # Validate the value of n
       5    if not [isinstance[n, int] and n >= 0]:
       6        raise ValueError[f'Positive integer number expected, got "{n}"']
       7
       8    # Handle the base cases
       9    if n in {0, 1}:
      10        return n
      11
      12    previous, fib_number = 0, 1
      13    for _ in range[2, n + 1]:
      14        # Compute the next Fibonacci number, remember the previous one
      15        previous, fib_number = fib_number, previous + fib_number
      16
      17    return fib_number
      
      9 và
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      0 và khởi tạo chúng với hai số đầu tiên trong chuỗi Fibonacci.
      defines two local variables,
       1# fibonacci_func.py
       2
       3def fibonacci_of[n]:
       4    # Validate the value of n
       5    if not [isinstance[n, int] and n >= 0]:
       6        raise ValueError[f'Positive integer number expected, got "{n}"']
       7
       8    # Handle the base cases
       9    if n in {0, 1}:
      10        return n
      11
      12    previous, fib_number = 0, 1
      13    for _ in range[2, n + 1]:
      14        # Compute the next Fibonacci number, remember the previous one
      15        previous, fib_number = fib_number, previous + fib_number
      16
      17    return fib_number
      
      9 and
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      0, and initializes them with the first two numbers in the Fibonacci sequence.

    • Dòng 13 bắt đầu một vòng

      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      1 lặp lại từ
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      2 đến
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      3. Vòng lặp sử dụng một dấu gạch dưới [
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      4] cho biến vòng lặp vì nó là một biến vứt bỏ và bạn đã giành được giá trị này trong mã.
      starts a
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      1 loop that iterates from
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      2 to
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      3. The loop uses an underscore [
      >>> from fibonacci_func import fibonacci_of
      
      >>> fibonacci_of[5]
      5
      >>> fibonacci_of[6]
      8
      >>> fibonacci_of[7]
      13
      
      >>> [fibonacci_of[n] for n in range[15]]
      [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
      
      4] for the loop variable because it’s a throwaway variable and you won’t be using this value in the code.

    • Dòng 15 tính toán số Fibonacci tiếp theo trong chuỗi và nhớ số trước. computes the next Fibonacci number in the sequence and remembers the previous one.

    • Dòng 17 Trả về số Fibonacci được yêu cầu. returns the requested Fibonacci number.

    Để thử mã này, hãy quay lại phiên tương tác của bạn và chạy mã sau:

    >>>

    >>> from fibonacci_func import fibonacci_of
    
    >>> fibonacci_of[5]
    5
    >>> fibonacci_of[6]
    8
    >>> fibonacci_of[7]
    13
    
    >>> [fibonacci_of[n] for n in range[15]]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    

    Việc thực hiện fibonacci_of[] này là khá tối thiểu. Nó sử dụng không bao gồm việc giải nén để tính toán các số fibonacci trong các vòng lặp, điều này khá hiệu quả. Tuy nhiên, mỗi khi bạn gọi hàm có giá trị khác nhau là n, nó phải tái tính trình tự một lần nữa. Để khắc phục điều này, bạn có thể sử dụng đóng cửa và làm cho chức năng của bạn nhớ các giá trị đã được tính toán giữa các cuộc gọi. Hãy tiếp tục và thử nó!iterable unpacking to compute the Fibonacci numbers during the loops, which is quite efficient memory-wise. However, every time you call the function with a different value of n, it has to recompute the sequence over again. To fix this, you can use closures and make your function remember the already computed values between calls. Go ahead and give it a try!

  • Sự kết luận

    Trình tự Fibonacci có thể giúp bạn cải thiện sự hiểu biết của bạn về đệ quy. Trong hướng dẫn này, bạn đã học được chuỗi Fibonacci là gì. Bạn cũng đã tìm hiểu về một số thuật toán phổ biến để tạo ra chuỗi và cách dịch chúng thành mã Python.Fibonacci sequence is. You’ve also learned about some common algorithms to generate the sequence and how to translate them into Python code.

    Trình tự Fibonacci có thể là một bàn đạp tuyệt vời và điểm vào thế giới đệ quy, đây là một kỹ năng cơ bản để có một lập trình viên.

    Trong hướng dẫn này, bạn đã học được cách:

    • Tạo chuỗi Fibonacci bằng thuật toán đệ quyrecursive algorithm
    • Tối ưu hóa thuật toán Fibonacci đệ quy của bạn bằng cách sử dụng ghi nhớmemoization
    • Tạo chuỗi Fibonacci bằng thuật toán lặpiterative algorithm

    Bạn cũng đã hình dung thuật toán đệ quy ghi nhớ để hiểu rõ hơn về cách nó hoạt động đằng sau hậu trường. Để làm điều đó, bạn đã sử dụng sơ đồ ngăn xếp cuộc gọi.call stack diagram.

    Khi bạn nắm vững các khái niệm trong hướng dẫn này, các kỹ năng lập trình Python của bạn sẽ được cải thiện cùng với tư duy thuật toán đệ quy của bạn.

    Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Khám phá chuỗi Fibonacci với 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: Exploring the Fibonacci Sequence With Python

    Sê -ri Fibonacci trong Python sử dụng đệ quy là gì?

    Chương trình Python để hiển thị trình tự Fibonacci bằng cách sử dụng Recursion Một chuỗi Fibonacci là một chuỗi các số nguyên mà hai thuật ngữ đầu tiên là 0 và 1 và tất cả các thuật ngữ khác của chuỗi có được bằng cách thêm hai số trước của chúng.Ví dụ: 0, 1, 1, 2, 3, 5, 8, 13, v.v.a sequence of integers which first two terms are 0 and 1 and all other terms of the sequence are obtained by adding their preceding two numbers. For example: 0, 1, 1, 2, 3, 5, 8, 13 and so on...

    Fibonacci đệ quy là gì?

    Hàm fibonacci được gọi là đệ quy cho đến khi chúng ta nhận được đầu ra.Trong hàm, trước tiên chúng tôi kiểm tra xem số N bằng 0 hoặc một.Nếu có, chúng ta trả về giá trị của n.Nếu không, chúng tôi gọi đệ quy Fibonacci với các giá trị N-1 và N-2.. In the function, we first check if the number n is zero or one. If yes, we return the value of n. If not, we recursively call fibonacci with the values n-1 and n-2.

    Phương pháp đệ quy trong Python là gì?

    Python cũng chấp nhận đệ quy chức năng, có nghĩa là một hàm được xác định có thể tự gọi.Recursion là một khái niệm toán học và lập trình phổ biến.Nó có nghĩa là một chức năng tự gọi.Điều này có lợi ích của ý nghĩa mà bạn có thể lặp qua dữ liệu để đạt được kết quả.a defined function can call itself. Recursion is a common mathematical and programming concept. It means that a function calls itself. This has the benefit of meaning that you can loop through data to reach a result.

    Bài Viết Liên Quan

    Chủ Đề