Làm thế nào đệ quy giai thừa hoạt động Python?

Theo định nghĩa, giai thừa là tích của một số nguyên dương và tất cả các số nguyên dương nhỏ hơn hoặc bằng số đã cho. Nói cách khác, lấy giai thừa của một số có nghĩa là nhân tất cả các số nguyên từ số đó xuống 1

0. cũng bằng 1, theo quy ước

Giai thừa được biểu thị bằng số nguyên và theo sau là dấu chấm than

5. biểu thị một giai thừa của năm

Và để tính giai thừa đó, chúng tôi nhân số với mọi số nguyên nhỏ hơn nó, cho đến khi chúng tôi đạt 1

5! = 5 * 4 * 3 * 2 * 1
5! = 120

Hãy ghi nhớ những quy tắc này, trong hướng dẫn này, chúng ta sẽ học cách tính giai thừa của một số nguyên bằng Python, sử dụng vòng lặp và đệ quy. Hãy bắt đầu với việc tính giai thừa bằng cách sử dụng các vòng lặp

Tính giai thừa bằng vòng lặp

Chúng ta có thể tính giai thừa bằng cách sử dụng cả vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
0 và vòng lặp
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1. Quá trình chung là khá giống nhau cho cả hai. Tất cả những gì chúng ta cần là một tham số làm đầu vào và một bộ đếm

Hãy bắt đầu với vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'

Bạn có thể nhận thấy rằng chúng tôi đang đếm bắt đầu từ 1 đến

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3, trong khi định nghĩa của giai thừa là từ số đã cho xuống 1. Nhưng về mặt toán học

$$
1 * 2 * 3 * 4. * n = n * (n-1) * (n-2) * (n-3) * (n-4). * (n - (n-1))
$$

Để đơn giản hóa,

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
4 sẽ luôn bằng 1

Điều đó có nghĩa là chúng ta đang đếm theo hướng nào không quan trọng. Nó có thể bắt đầu từ 1 và tăng dần về phía 13, hoặc có thể bắt đầu từ 13 và giảm xuống 1. Bây giờ điều đó đã được làm rõ, hãy bắt đầu chia nhỏ chức năng mà chúng ta vừa viết

Hàm của chúng tôi nhận tham số

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 biểu thị số mà chúng tôi đang tính giai thừa cho. Đầu tiên, chúng ta định nghĩa một biến có tên là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
8 và gán giá trị cho nó là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
9

Tại sao chỉ định 1 chứ không phải 0 bạn yêu cầu?

Bởi vì nếu ta gán 0 cho nó thì tất cả những phép nhân sau với 0 đương nhiên sẽ ra một con số 0 rất lớn.

Sau đó, chúng tôi bắt đầu vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1 của mình trong phạm vi từ
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
9 đến
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
42. Hãy nhớ rằng, phạm vi Python sẽ dừng trước đối số thứ hai. Để bao gồm cả số cuối cùng, chúng tôi chỉ cần thêm một
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
9 bổ sung

Bên trong vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1, chúng tôi nhân giá trị hiện tại của
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
8 với giá trị hiện tại của chỉ mục của chúng tôi
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
46

Cuối cùng, chúng tôi trả về giá trị cuối cùng của

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
8. Hãy kiểm tra chức năng của chúng tôi in ra kết quả

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
4

Nếu bạn muốn đọc thêm về cách lấy đầu vào của người dùng, hãy đọc phần Lấy đầu vào của người dùng bằng Python của chúng tôi

Nó sẽ nhắc người dùng đưa ra đầu vào. Chúng tôi sẽ thử với

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
48

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
2

Bạn có thể sử dụng máy tính để xác minh kết quả

4. là

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
49, kết quả là 24

Bây giờ hãy xem cách chúng ta có thể tính giai thừa bằng cách sử dụng vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
0. Đây là chức năng sửa đổi của chúng tôi

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
5

Điều này khá giống với vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1. Ngoại trừ lần này chúng ta đang chuyển từ
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 sang 1, gần với định nghĩa toán học hơn. Hãy kiểm tra chức năng của chúng tôi

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
8

Chúng tôi sẽ nhập 4 làm đầu vào một lần nữa

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
2

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

Mặc dù phép tính là

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
49 nhưng kết quả cuối cùng vẫn giống như trước đây

Tính giai thừa bằng cách sử dụng các vòng lặp thật dễ dàng. Bây giờ chúng ta hãy xem cách tính giai thừa bằng hàm đệ quy

Tính giai thừa bằng cách sử dụng đệ quy

Một hàm đệ quy là một hàm gọi chính nó. Thoạt nghe có vẻ hơi đáng sợ nhưng hãy kiên trì và bạn sẽ thấy rằng các hàm đệ quy rất dễ hiểu

Nói chung, mọi hàm đệ quy đều có hai thành phần chính. một trường hợp cơ sở và một bước đệ quy

Các trường hợp cơ sở là các trường hợp nhỏ nhất của vấn đề. Ngoài ra, một trường hợp ngắt, một trường hợp sẽ trả về một giá trị và sẽ thoát khỏi đệ quy. Về hàm giai thừa, trường hợp cơ bản là khi chúng ta trả về phần tử cuối cùng của giai thừa, là 1

Nếu không có trường hợp cơ sở hoặc trường hợp cơ sở không chính xác, hàm đệ quy của bạn có thể chạy vô hạn, gây ra tràn

Các bước đệ quy - như tên ngụ ý - là phần đệ quy của hàm, trong đó toàn bộ vấn đề được chuyển đổi thành một thứ nhỏ hơn. Nếu bước đệ quy không thu nhỏ được vấn đề, thì đệ quy lại có thể chạy vô hạn

Xem xét phần định kỳ của giai thừa

Nhưng chúng ta cũng biết rằng

Nói cách khác 5. là

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
24 và 4. là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
25, v.v.

Vì vậy, chúng ta có thể nói rằng

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
26. Đây sẽ là bước đệ quy của giai thừa của chúng tôi

Một đệ quy giai thừa kết thúc khi nó đạt 1. Đây sẽ là trường hợp cơ sở của chúng tôi. Chúng tôi sẽ trả lại

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
9 nếu
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
9 trở xuống, bao gồm đầu vào bằng 0

Chúng ta hãy xem hàm giai thừa đệ quy của chúng ta

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
7

Như bạn thấy, khối

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
50 thể hiện trường hợp cơ sở của chúng tôi, trong khi khối
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
51 bao gồm bước đệ quy

Hãy kiểm tra chức năng của chúng tôi

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
0

Chúng tôi sẽ nhập 3 làm đầu vào lần này

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1

Chúng tôi nhận được kết quả tương tự. Nhưng lần này, những gì diễn ra khá thú vị

Bạn thấy đấy, khi chúng ta nhập dữ liệu vào, hàm sẽ kiểm tra với khối

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
50 và vì 3 lớn hơn 1 nên nó sẽ bỏ qua khối
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
51. Trong khối này, chúng ta thấy dòng
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
54

Chúng tôi biết giá trị hiện tại của

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 vào lúc này, đó là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
56, nhưng
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
57 vẫn cần được tính toán

Sau đó, chương trình gọi hàm tương tự một lần nữa, nhưng lần này hàm của chúng ta lấy 2 làm tham số. Nó kiểm tra khối

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
50 và bỏ qua khối
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
51 và gặp lại dòng cuối cùng. Bây giờ, giá trị hiện tại của
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 là
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
81 nhưng chương trình vẫn phải tính toán
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
57

Vì vậy, nó gọi hàm một lần nữa, nhưng lần này là khối

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
50, hay đúng hơn, lớp cơ sở thành công trả về 1 và thoát ra khỏi đệ quy

Theo cùng một mẫu hướng lên trên, nó trả về từng kết quả của hàm, nhân kết quả hiện tại với

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
3 trước đó và trả về kết quả đó cho lệnh gọi hàm trước đó. Nói cách khác, trước tiên, chương trình của chúng ta đi đến cuối giai thừa (là 1), sau đó xây dựng theo cách của nó, đồng thời nhân lên trên mỗi bước

Đồng thời loại bỏ từng chức năng khỏi ngăn xếp cuộc gọi, cho đến khi kết quả cuối cùng của

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
85 được trả về

Đây thường là cách các hàm đệ quy hoạt động. Một số vấn đề phức tạp hơn có thể yêu cầu đệ quy sâu hơn với nhiều hơn một trường hợp cơ sở hoặc nhiều hơn một bước đệ quy. Nhưng hiện tại, phép đệ quy đơn giản này đủ tốt để giải bài toán giai thừa của chúng ta

Nếu bạn muốn tìm hiểu thêm về đệ quy trong Python, hãy đọc Hướng dẫn của chúng tôi để hiểu về đệ quy trong Python

Sự kết luận

Trong bài viết này, chúng tôi đã đề cập đến cách tính giai thừa bằng cách sử dụng các vòng lặp

def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
1 và
def get_factorial_for_loop(n):
    result = 1
    if n > 1:
        for i in range(1, n+1):
            result = result * i
        return result
    else:
        return 'n has to be positive'
0. Chúng ta cũng đã học đệ quy là gì và cách tính giai thừa bằng đệ quy

Nếu bạn thích đệ quy và muốn thực hành thêm, hãy thử tính dãy Fibonacci bằng đệ quy. Và nếu bạn có bất kỳ câu hỏi hoặc suy nghĩ nào về bài viết của chúng tôi, vui lòng chia sẻ trong phần bình luận

Giai thừa đệ quy hoạt động như thế nào?

Hàm giai thừa có thể được viết dưới dạng lời gọi hàm đệ quy. Nhớ lại rằng giai thừa(n) = n × (n – 1) × (n – 2) × … × 2 × 1. Hàm giai thừa có thể được viết lại theo cách đệ quy dưới dạng giai thừa(n) = n × giai thừa(n – 1) .

Hàm đệ quy trong giai thừa Python là gì?

Đệ quy thừa số là phương pháp trong đó một hàm trực tiếp hoặc gián tiếp gọi chính nó . Trong toán học, Giai thừa có nghĩa là tích của tất cả các số nguyên dương từ 1 đến số đó. Dấu chấm than được sử dụng sau số nguyên để chỉ ra rằng đó là giai thừa. Ví dụ, giai thừa tám là 8.

Python tính giai thừa như thế nào?

Sử dụng chức năng tích hợp sẵn .
# Chương trình Python để tìm
# giai thừa của số đã cho
nhập toán
sự thật chắc chắn (n)
trở lại (toán học. giai thừa(n))
num = int(input("Nhập số. "))
f = thực tế (số)
print("Giai thừa của", num, "là", f)

Giai thừa đệ quy có nhanh hơn lặp lại không?

Lặp nhanh hơn và hiệu quả hơn đệ quy . Việc tối ưu hóa các mã lặp lại dễ dàng hơn và chúng thường có độ phức tạp về thời gian đa thức.