In ra tam giác pascal trong python



Đề bài: Viết chương trình Python vẽ tam giác Pascal trong Python.

Tam giác Pascal có qui tắc sau:

Tất cả các giá trị bên ngoài tam giác được xem như là 0.

Hàng đầu tiên sẽ là 0 1 0, trong đó chỉ có giá trị 1 có được một khoảng trống trong tam giác Pascal, còn 0 là không nhìn thấy.

Hàng thứ hai được tạo bằng cách cộng hai số liên tiếp nhau từ hàng thứ nhất: (0 + 1) và (1 + 0).

Các hàng còn lại cũng được tạo bằng cách cộng như trên. Ví dụ với hàng thứ ba là cộng các số liên tiếp nhau từ hàng thứ hai: (0 + 1), (1 + 1) và (1 + 0).

In ra tam giác pascal trong python



Lời giải: bài tập vẽ tam giác Pascal trong Python

Chúng ta sử dụng ba vòng lặp lồng nhau. Một vòng lặp bên ngoài để điều khiển số hàng. Hai vòng lặp bên trong: một vòng lặp để in khoảng trống và một vòng lặp để in giá trị.

Dưới đây là chương trình Python để giải bài tập vẽ tam giác Pascal trong Python:

def factorial(n):
    f = 1
    while (n > 1):
        f = f * n
        n = n - 1
    return f

def ncr(n, r):
    return int(factorial(n) / (factorial(n - r) * factorial(r)))

n = 6
print("Ve tam giac Pascal:");
for i in range(0, n + 1):
    for j in range(0, n - i + 1):
        print("", end = "  ")

    for j in range(0, i + 1):
        print(" {:<3}".format(ncr(i, j)), end="")

    print("")

Kết quả:

Ve tam giac Pascal:
                 1  
               1   1  
             1   2   1  
           1   3   3   1  
         1   4   6   4   1  
       1   5   10  10  5   1  
     1   6   15  20  15  6   1  
   1   7   21  35  35  21  7   1  



Hướng dẫn này sẽ dạy bạn cách in tam giác Pascal bằng Python cho một số hàng nhất định.

Bạn sẽ bắt đầu bằng cách học cách xây dựng tam giác Pascal. Sau đó, bạn sẽ tiến hành viết một hàm Python và học cách tối ưu hóa nó hơn nữa.

▶ ️ Hãy bắt đầu!

  • Tam giác Pascal là gì và cách xây dựng nó như thế nào?
  • Hàm Python để in Tam giác Pascal
    • Phân tích cú pháp định nghĩa hàm
  • In tam giác Pascal bằng phép đệ quy
  • Hàm Python để in Tam giác Pascal cho numRows ≤ 5
    • Sự kết luận
    • Share this post!

Tam giác Pascal là gì và cách xây dựng nó như thế nào?

In hình tam giác Pascal cho một số hàng nhất định là một câu hỏi phỏng vấn phổ biến.

Trong tam giác Pascal có n hàng, hàng thứ i có i phần tử.

Vì vậy, hàng đầu tiên có một phần tử, và đó là 1. Và mỗi phần tử trong các hàng tiếp theo là tổng của hai số ngay trên nó.

Hình sau đây giải thích cách xây dựng tam giác Pascal có năm hàng.

Tam giác Pascal cho numRows = 5 (Hình ảnh của tác giả)

Lưu ý cách bạn có thể đệm số không khi bạn chỉ có một số bên trên một số nhất định.

📝 Là một bài tập nhanh, hãy làm theo quy trình trên để dựng tam giác Pascal với n = 6 và n = 7.

Tiếp theo, chúng ta hãy tiến hành viết một số mã. Bạn có thể chọn chạy các đoạn mã trên Python IDE của techpoe.com ngay từ trình duyệt của mình— khi bạn thực hiện theo cách của mình thông qua hướng dẫn.

Trong phần này, chúng ta hãy viết một hàm Python để in tam giác Pascal với bất kỳ số hàng nhất định nào.

Có hai câu hỏi chính cần xem xét:

  • Làm thế nào để biểu diễn các mục trong tam giác Pascal?
  • Làm thế nào để in tam giác Pascal với khoảng cách và định dạng thích hợp?

Hãy trả lời chúng ngay bây giờ.

# 1. Biểu thức cho mỗi mục nhập trong tam giác Pascal là gì?

Điều đó xảy ra là các mục trong tam giác Pascal có thể được lấy bằng công thức cho nCr. Nếu bạn nhớ lại từ môn toán ở trường của mình, nCr biểu thị số cách bạn có thể chọn r mục từ tập hợp n mục.

Công thức cho nCr được đưa ra dưới đây:

công thức nCr (Hình ảnh của tác giả)

Bây giờ chúng ta hãy tiến hành biểu diễn các mục trong tam giác Pascal bằng công thức nCr.

In ra tam giác pascal trong python
Các mục nhập tam giác Pascal sử dụng nCr (Hình ảnh của tác giả)

Bây giờ chúng tôi đã tìm ra một cách để thể hiện các mục nhập trong ma trận.

# 2. Làm thế nào để điều chỉnh khoảng cách khi in mẫu?

Trong tam giác Pascal với numRows, hàng số 1 có một mục nhập, hàng số 2 có hai mục nhập, v.v. Để in mẫu dưới dạng hình tam giác, bạn sẽ cần numRows – i khoảng trắng trong hàng #i. Và bạn có thể sử dụng hàm phạm vi của Python kết hợp với vòng lặp for để thực hiện điều này.

Vì hàm phạm vi loại trừ điểm cuối theo mặc định, hãy đảm bảo thêm + 1 để nhận được số khoảng trắng đầu cần thiết.

Bây giờ bạn đã học cách biểu diễn các mục nhập và cũng như cách điều chỉnh không gian trong khi in tam giác Pascal, hãy tiếp tục và định nghĩa hàm pascal_tri.

Phân tích cú pháp định nghĩa hàm

Vậy bạn muốn hàm pascal_tri làm gì?

  • Hàm pascal_tri nên chấp nhận số hàng (numRows) làm đối số.
  • Nó sẽ in ra tam giác Pascal với numRows.

Để tính giai thừa, hãy sử dụng chức năng giai thừa từ mô-đun toán học tích hợp sẵn của Python.

▶ ️ Chạy ô mã sau để nhập giai thừa và sử dụng nó trong mô-đun hiện tại của bạn.

from math import factorial

Đoạn mã bên dưới chứa định nghĩa hàm.

def pascal_tri(numRows):
  '''Print Pascal's triangle with numRows.'''
  for i in range(numRows):
    # loop to get leading spaces
	  for j in range(numRows-i+1):
		  print(end=" ")
    
    # loop to get elements of row i
	  for j in range(i+1):
		  # nCr = n!/((n-r)!*r!)
		  print(factorial(i)//(factorial(j)*factorial(i-j)), end=" ")

	 # print each row in a new line
	  print("n")

Chức năng hoạt động như sau:

  • Hàm pascal_tri có một tham số bắt buộc numRows: số hàng.
  • Có tất cả các hàng numRows. Đối với mỗi hàng i, chúng ta thêm numRows – i khoảng trắng trước mục nhập đầu tiên trong hàng.
  • Sau đó, chúng tôi sử dụng công thức nCr để tính các mục nhập riêng lẻ. Đối với hàng i, các mục nhập là iCj trong đó j = {0,1,2, .., i}.
  • Quan sát rằng chúng tôi sử dụng // thực hiện phép chia số nguyên, vì chúng tôi muốn các mục nhập là số nguyên.
  • Sau khi tính toán tất cả các mục nhập trong một hàng, hãy in hàng tiếp theo trong một dòng mới.

🔗 Như chúng tôi đã thêm một docstring, bạn có thể sử dụng hàm trợ giúp tích hợp của Python hoặc thuộc tính __doc__ để truy cập vào chuỗi doc của hàm. Đoạn mã dưới đây cho biết cách thực hiện.

help(pascal_tri)

# Output
Help on function pascal_tri in module __main__:

pascal_tri(numRows)
    Print Pascal's triangle with numRows.

pascal_tri.__doc__

# Output
Print Pascal's triangle with numRows.

Bây giờ chúng ta hãy tiếp tục và gọi hàm với số hàng là đối số.

pascal_tri(3)

# Output
     1
    1 1
   1 2 1

3 hàng đầu tiên của tam giác Pascal được in ra, như mong đợi.

In tam giác Pascal bằng phép đệ quy

Trong phần trước, chúng ta đã xác định được biểu thức toán học của từng mục nhập trong Tam giác Pascal. Tuy nhiên, chúng tôi đã không sử dụng mối quan hệ giữa các mục nhập trong hai hàng liên tiếp.

Trên thực tế, chúng tôi đã sử dụng hàng trước đó để tính toán các mục trong hàng tiếp theo. Chúng ta có thể không sử dụng điều này và đưa ra cách triển khai đệ quy của hàm pascal_tri không?

Được rồi hãy làm vậy đi!

Trong một triển khai đệ quy, một hàm liên tục gọi chính nó cho đến khi đáp ứng trường hợp cơ sở. Trong việc xây dựng tam giác Pascal, chúng ta bắt đầu với hàng đầu tiên với một mục nhập 1, sau đó xây dựng các hàng tiếp theo.

Vì vậy, hàm gọi tới pascal_tri (numRows) lần lượt gọi tới pascal_tri (numRows-1) và cứ tiếp tục như vậy cho đến khi đạt đến trường hợp cơ sở pascal_tri (1).

Hãy xem xét ví dụ mà bạn cần in 3 hàng đầu tiên của tam giác Pascal. Hình ảnh sau đây giải thích cách các lệnh gọi đệ quy được đẩy vào ngăn xếp. Và cách gọi hàm đệ quy trả về các hàng của tam giác Pascal.

In ra tam giác pascal trong python
Ngăn xếp cuộc gọi trong các cuộc gọi đệ quy (Hình ảnh của tác giả)

▶ ️ Chạy đoạn mã dưới đây để tạo một cách đệ quy các hàng của tam giác Pascal.

def pascal_tri(numRows):
    '''Print Pascal's triangle with numRows.'''
    if numRows == 1:
        return [[1]] # base case is reached!
    else:
        res_arr = pascal_tri(numRows-1) # recursive call to pascal_tri
        # use previous row to calculate current row 
        cur_row = [1] # every row starts with 1
        prev_row = res_arr[-1] 
        for i in range(len(prev_row)-1):
            # sum of 2 entries directly above
            cur_row.append(prev_row[i] + prev_row[i+1]) 
        cur_row += [1] # every row ends with 1
        res_arr.append(cur_row)
        return res_arr

Dưới đây là một số điểm đáng lưu ý:

  • Chúng tôi đã sử dụng một danh sách lồng nhau làm cấu trúc dữ liệu, trong đó mỗi hàng trong tam giác Pascal là một danh sách, như sau: [[row 1], [row 2],…,[row n]].
  • Lệnh gọi hàm pascal_tri (numRows) kích hoạt một loạt các lệnh gọi đệ quy với numRows – 1, numRows – 2 cho đến 1 làm đối số. Các cuộc gọi này được đẩy lên một ngăn xếp.
  • Khi numRows == 1, chúng ta đã đến trường hợp cơ sở và hàm trả về [[1]].
  • Bây giờ danh sách trả về được sử dụng bởi các hàm tiếp theo trong ngăn xếp cuộc gọi — để tính toán hàng tiếp theo.
  • Nếu cur_row là hàng hiện tại, cur_row[i] = pres_row[i] + pres_row[i+1]—Tổng của 2 phần tử ngay trên chỉ mục hiện tại.

Vì mảng được trả về là một danh sách lồng nhau (danh sách các danh sách), chúng ta cần điều chỉnh khoảng cách và in ra các mục nhập, như được hiển thị trong ô mã bên dưới.

tri_array = pascal_tri(5)

for i,row in enumerate(tri_array):
  for j in range(len(tri_array) - i + 1):
    print(end=" ") # leading spaces
  for j in row:
    print(j, end=" ") # print entries
  print("n")  # print new line

Đầu ra là chính xác, như được thấy bên dưới!

# Output

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Hàm Python để in Tam giác Pascal cho numRows ≤ 5

Cả hai phương pháp mà bạn đã học sẽ hoạt động để in tam giác Pascal với một số lượng hàng numRows tùy ý.

Tuy nhiên, đôi khi bạn cần in tam giác Pascal với số lượng hàng nhỏ hơn. Và khi số hàng bạn cần in nhiều nhất là 5 – bạn có thể sử dụng một kỹ thuật đơn giản.

Đi qua hình bên dưới. Và quan sát cách lũy thừa của 11 giống với các mục trong tam giác Pascal. Ngoài ra, hãy lưu ý rằng điều này chỉ hoạt động đến lũy thừa thứ 4 của 11. Tức là, 11 được nâng lên lũy thừa {0, 1, 2, 3, 4} cho các mục từ hàng 1 đến hàng 5 của tam giác Pascal.

In ra tam giác pascal trong python

Hãy viết lại định nghĩa hàm, như hình dưới đây:

def pascal_tri(numRows):
  '''Print Pascal's triangle with numRows.'''
  for i in range(numRows):
    print(' '*(numRows-i), end='')
    # compute power of 11
    print(' '.join(str(11**i)))

Đây là cách hàm pascal_tri hoạt động:

  • Như với các ví dụ trước, chúng tôi điều chỉnh khoảng cách.
  • Và sau đó, chúng tôi sử dụng toán tử lũy thừa của Python (**) để tính lũy thừa của 11.
  • Vì lũy thừa của 11 là số nguyên theo mặc định, hãy chuyển đổi chúng thành một chuỗi bằng cách sử dụng str (). Bây giờ bạn có quyền hạn của 11 dưới dạng chuỗi.
  • Các chuỗi trong Python là các chuỗi lặp lại — vì vậy bạn có thể lặp qua chúng và truy cập một ký tự tại một thời điểm.
  • Tiếp theo, bạn có thể sử dụng phương thức join () với cú pháp: .join () để nối các phần tử trong bằng cách sử dụng làm dấu phân tách.
  • Ở đây, bạn cần một khoảng trắng duy nhất giữa các ký tự, vì vậy sẽ là ”, là string: lũy thừa của 11.

Hãy kiểm tra xem chức năng có hoạt động như dự định không.

pascal_tri(5)

# Output
     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

Ví dụ khác, hãy gọi hàm pascal_tri với 4 làm đối số.

pascal_tri(4)

# Output
     1
    1 1
   1 2 1
  1 3 3 1

Tôi hy vọng bạn biết cách bạn có thể dễ dàng in tam giác Pascal cho numRows trong phạm vi từ 1 đến 5.

Sự kết luận

Đây là những gì chúng tôi đã học được:

  • Cách dựng tam giác Pascal với số hàng cho trước. Mọi số trong mỗi hàng là tổng của hai số ngay trên nó.
  • Viết một hàm Python bằng công thức nCr = n! / (Nr) !. r! để tính các mục của tam giác Pascal.
  • Sau đó, bạn đã học được cách triển khai đệ quy của hàm.
  • Cuối cùng, bạn đã học được phương pháp tối ưu nhất để xây dựng tam giác Pascal với số lượng lên đến 5 — sử dụng lũy ​​thừa của 11.

Nếu bạn đang muốn nâng cao kỹ năng Python, hãy học cách nhân ma trận, kiểm tra xem một số có phải là số nguyên tố hay không và giải quyết các vấn đề về các phép toán chuỗi. Chúc bạn viết mã vui vẻ!