Python xây dựng danh sách đệ quy

Lưu ý. Unable to call function function contact,unlimited. Để ngăn chặn các quy định vô hạn, thường sử dụng câu lệnh nếu. Tức là, mọi hàm đệ quy phải có điều kiện dừng đệ quy, tránh hàm gọi hàm vô hạn

Trình thông dịch Python giới hạn độ sâu của đệ quy (độ sâu của đệ quy) để giúp tránh đệ quy vô hạn, dẫn đến ngăn xếp (ngăn xếp). Theo mặc định, độ sâu tối đa của đệ quy là 1000. Nếu vượt qua giới hạn sẽ dẫn đến lỗi

#Factorial of n = 1*2*3*...*n
def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

n = int(input("Enter a non-negative number: "))
while(n<=0):
    n = int(input("Enter a non-negative number: "))
result = factorial(n)
print("Factorial of", n, "=", result)
3. Ví dụ

def recursor():
    recursor()
recursor()
Kết quả
Traceback (most recent call last):
  File "c:\python-examples\sumPython.py", line 3, in 
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Chương trình Python tính giai thừa minh họa hàm đệ quy

Tính năng thừa kế của n. S(n) = n. = 1*2*…*(n-1)*n

Ta thấy S(n) = S(n-1)*n. Do đó tính S(n) ta sẽ tính S(n-1). Tương tự tính toán S(n-2), …, S(2), S(1), S(0) = 1

#Factorial of n = 1*2*3*...*n
def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

n = int(input("Enter a non-negative number: "))
while(n<=0):
    n = int(input("Enter a non-negative number: "))
result = factorial(n)
print("Factorial of", n, "=", result)
Kết quả
Enter a non-negative number: 4
Factorial of 4 = 24

Hàm đệ quy

#Factorial of n = 1*2*3*...*n
def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

n = int(input("Enter a non-negative number: "))
while(n<=0):
    n = int(input("Enter a non-negative number: "))
result = factorial(n)
print("Factorial of", n, "=", result)
4 on active as after

def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

Khi nhập n = 4, gọi hàm result = giai thừa(n); . Hàm giai thừa(3) = 3 * giai thừa(2). Hàm giai thừa(2) = 2 * giai thừa(1). Mà khi n = 1 (không biết điều kiện if (n > 1)) thì return 1 tức là giai thừa(1) = 1

Do đó, kết quả = giai thừa(n) = 4*3*2*1 = 24

2. Chương trình xuất dãy số fibonacci sử dụng hàm đệ quy

Dãy Fibonacci là dãy số vô hạn tự nhiên bắt đầu bằng hai phần tử 0 và 1. Sau đó các phần tử được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó. Công thức truy hồi của dãy fibonacci có định dạng. f(n) = f(n-1) + f(n-2) với f(0) = 0, f(1) = 1

Khi tính f(n) với n > 1 phải dựa vào 2 số fibonacci trước đó. Bài toán này có thể sử dụng hàm đệ quy như sau

def fibonacci(x):
    if((x==1) or (x==0)):
        return x
    else:
        return fibonacci(x-1) + fibonacci(x-2)

i=0
x = int(input("Enter the number of terms of series : "))
while(x<=1):
    x = int(input("Enter the number of terms of series : "))
print("Fibonacci Series : ")
while i < x:
    print(fibonacci(i), end=' ')
    i = i + 1
Kết quả
Enter the number of terms of series : 5
Fibonacci Series : 
0 1 1 2 3

3. Ưu và nhược điểm của hàm đệ quy

ưu điểm

– Mã trợ giúp ngắn hơn và rõ ràng hơn

– Một nhiệm vụ phức tạp có thể được chia thành các bài toán đơn giản hơn bằng cách sử dụng đệ quy

nhược điểm

– Lệnh gọi hàm liên tục sẽ khởi tạo các biến cục bộ trong hàm một cách liên tục và tạo bộ nhớ

Lưu ý. Unable to call function function contact,unlimited. Để ngăn chặn các quy định vô hạn, thường sử dụng câu lệnh nếu. Tức là, mọi hàm đệ quy phải có điều kiện dừng đệ quy, tránh hàm gọi hàm vô hạn

Trình thông dịch Python giới hạn độ sâu của đệ quy (độ sâu của đệ quy) để giúp tránh đệ quy vô hạn, dẫn đến ngăn xếp (ngăn xếp). Theo mặc định, độ sâu tối đa của đệ quy là 1000. Nếu vượt qua giới hạn sẽ dẫn đến lỗi

def recursor():
    recursor()
recursor()
5. Ví dụ

def recursor():
    recursor()
recursor()
Kết quả
Traceback (most recent call last):
  File "c:\python-examples\sumPython.py", line 3, in 
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Chương trình Python tính giai thừa minh họa hàm đệ quy

Tính năng thừa kế của n. S(n) = n. = 1*2*…*(n-1)*n

Ta thấy S(n) = S(n-1)*n. Do đó tính S(n) ta sẽ tính S(n-1). Tương tự tính toán S(n-2), …, S(2), S(1), S(0) = 1

#Factorial of n = 1*2*3*...*n
def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

n = int(input("Enter a non-negative number: "))
while(n<=0):
    n = int(input("Enter a non-negative number: "))
result = factorial(n)
print("Factorial of", n, "=", result)
Kết quả
Enter a non-negative number: 4
Factorial of 4 = 24

Hàm đệ quy

def recursor():
    recursor()
recursor()
6 on active as after

def factorial(n):
    if (n > 1):
        return n * factorial(n - 1)
    else:
        return 1

Khi nhập n = 4, gọi hàm result = giai thừa(n); . Hàm giai thừa(3) = 3 * giai thừa(2). Hàm giai thừa(2) = 2 * giai thừa(1). Mà khi n = 1 (không biết điều kiện if (n > 1)) thì return 1 tức là giai thừa(1) = 1

Do đó, kết quả = giai thừa(n) = 4*3*2*1 = 24

2. Chương trình xuất dãy số fibonacci sử dụng hàm đệ quy

Dãy Fibonacci là dãy số vô hạn tự nhiên bắt đầu bằng hai phần tử 0 và 1. Sau đó các phần tử được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó. Công thức truy hồi của dãy fibonacci có định dạng. f(n) = f(n-1) + f(n-2) với f(0) = 0, f(1) = 1

Khi tính f(n) với n > 1 phải dựa vào 2 số fibonacci trước đó. Bài toán này có thể sử dụng hàm đệ quy như sau

def fibonacci(x):
    if((x==1) or (x==0)):
        return x
    else:
        return fibonacci(x-1) + fibonacci(x-2)

i=0
x = int(input("Enter the number of terms of series : "))
while(x<=1):
    x = int(input("Enter the number of terms of series : "))
print("Fibonacci Series : ")
while i < x:
    print(fibonacci(i), end=' ')
    i = i + 1
Kết quả
Enter the number of terms of series : 5
Fibonacci Series : 
0 1 1 2 3

3. Ưu và nhược điểm của hàm đệ quy

ưu điểm

– Mã trợ giúp ngắn hơn và rõ ràng hơn

– Một nhiệm vụ phức tạp có thể được chia thành các bài toán đơn giản hơn bằng cách sử dụng đệ quy

nhược điểm

– Lệnh gọi hàm liên tục sẽ khởi tạo các biến cục bộ trong hàm một cách liên tục và tạo bộ nhớ

– Quá trình xử lý tốn nhiều thời gian hơn

– Khó gỡ lỗi để tìm ra lỗi

  • Giới thiệu môn học Ngôn ngữ lập trình Java
  • Lớp FileReader và FileWriter trong Java
  • Hàm khởi tạo (hàm tạo) __init__() của lớp trong Python
  • Kỹ thuật lập trình với mảng 2 chiều trong Java
  • Biến toàn cục và biến cục bộ trong chương trình

Đầu vào

Trong bài viết trước, Kteam đã giới thiệu cho bạn KEXPRESS FUNCTION TRONG PYTHON – FUNCTIONAL TOOLS

Và ở bài viết này, Kteam sẽ tìm hiểu lại các KIỂU DỮ LIỆU CHỨC NĂNG – ĐỆ QUY trong Python.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần

  • Cài đặt sẵn MÔI TRƯỜNG PHÁT TRIỂN CỦA PYTHON
  • Xem qua bài CÁCH CHUYỂN TRÌNH PYTHON
  • Nắm CÁCH GHI CHÚ VÀ BIẾN TRONG PYTHON
  • CÁC KỲ DIỄN GIẢN THAY ĐỔI GIỚI THIỆU TRONG PYTHON
  • CÂU ĐIỀU KIỆN NẾU TRONG PYTHON

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Giới thiệu về đệ quy
  • Minh họa đệ quy bằng cách tính tổng
  • Đệ quy theo phong cách Python
  • Quy định và vòng lặp

Giới thiệu về đệ quy

Đệ 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ý của Python có thể áp dụng các cấu trúc vòng lặp . 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ỉ

Traceback (most recent call last):
  File "c:\python-examples\sumPython.py", line 3, in 
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
6

Ở 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 lo lắng, ai cũng đều 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. Những lúc như thế này, bạn nên thêm một hàm in để xem cụ thể là chuyện gì xảy ra

Traceback (most recent call last):
  File "c:\python-examples\sumPython.py", line 3, in 
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  File "c:\python-examples\sumPython.py", line 2, in recursor
    recursor()
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
7

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 lambdakhông? . You can apply to use it to đệ quy. ternary expression. Bạn có thể áp dụng để sử dụng nó để đệ quy:

def recursor():
    recursor()
recursor()
0

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 recursor():
    recursor()
recursor()
1

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

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

def recursor():
    recursor()
recursor()
2

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

def recursor():
    recursor()
recursor()
3

Đệ 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 recursor():
    recursor()
recursor()
4

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ê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