01/10/2018, 12:01

Nhờ giải thích đoạn Code về Class trong Python

Xin chào mọi người, e đang tìm hiểu về Class trong Python . Em có đoạn Code này mà đọc đi đọc lại vẫn không hiểu được.
Vì vậy em lên đây để nhờ mọi người giúp đỡ. Mọi người giải thích Code giúp e được không ạ

class py_solution:
  
    def sub_sets(self, sset):
        return self.subsetsRecur([], sorted(sset))
    
    def subsetsRecur(self, current, sset):
        if sset:
            return self.subsetsRecur(current, sset[1:]) + self.subsetsRecur(current + [sset[0]], sset[1:])
        return [current]

print(py_solution().sub_sets([4,5,6]))
Henry viết 14:13 ngày 01/10/2018

Lấy giấy vẽ ra. Mình vẽ cho bạn một trường hợp là list truyền vào là [1, 2]

Thinh Minh Ha viết 14:02 ngày 01/10/2018

Lấy giấy vẽ ra. Mình vẽ cho bạn một trường hợp là list truyền vào là [1, 2]

Ôi nhìn rắc rối quá … Để em đọc nghiên cứu thêm có gì không hiểu e hỏi lại anh sau nhé.
Cám ơn anh nhiều nghen …^^

Henry viết 14:16 ngày 01/10/2018

Bạn cứ nhớ mỗi lần sset là một cái rỗng thì nó sẽ trả về giá trị.

Henry viết 14:16 ngày 01/10/2018

Thêm một cái nữa. Những dấu + mà thấy cùng một cột(viết thẳng hàng) với nhau thì nó là một đấy.

Thinh Minh Ha viết 14:14 ngày 01/10/2018

Em chia nhỏ đoạn Code ra để phân tích.Anh cho e hỏi mấy chổ này với ạ:

- Hàm thứ nhất là:

def sub_sets(self, sset):
        return self.subsetsRecur([], sorted(sset))

Có phải nó sẽ trả về kq là : ( [] , [list ban đầu đã được sắp xếp từ nhỏ đến lớn] ) đúng không ạ ?

Sang hàm thứ hai:

  def subsetsRecur(self, current, sset):
        if sset:
            return self.subsetsRecur(current, sset[1:]) + self.subsetsRecur(current + [sset[0]], sset[1:])
        return [current]

sset ở đây có phải là list đã được sắp xếp ở trên không ạ và e không hiểu điều kiện kiểm tra
if sset: ở đây là như thế nào ạ.

Mong nhờ anh hỗ trợ thêm ạ !

HK boy viết 14:01 ngày 01/10/2018

if sset: ở đây là như thế nào ạ.

Kiểm tra xem ssetlen() > 0 hay không.

Thử trên IDLE:

>>> a = []
>>> if a:
	print(len(a))
else:
	print("NOOOOO")

	
NOOOOO
>>> a = [4]
>>> if a:
	print(len(a))
else:
	print("NOOOOO")

	
1
Thinh Minh Ha viết 14:16 ngày 01/10/2018

Kiểm tra xem sset có len() > 0 hay không.

Dạ. if sset về ý nghĩa của dòng Code thì e hiểu rồi( đương nhiên là để kiểm tra xem trong sset có phần tử hay không - như anh đã ví dụ ở trên ) . Cái mà e không hiểu ở đây là về mặt Logic cơ, vì rõ ràng danh sách ta nhập vào ban đầu là chắc chắn có phần tử rồi, tại sao còn phải kiểm tra lại làm gì thế ạ.

HK boy viết 14:12 ngày 01/10/2018

subsetsRecur là hàm đệ quy mà. Bạn thử thêm vào dòng print(sset) vào ngay sau dòng def, bạn sẽ thấy có 1 lúc nào đó sset sẽ rỗng.

Nói 1 cách cụ thể hơn, khi bạn gọi hàm subsetsRecur với current = 2, sset = [3] thì khi trả về, hàm sẽ trả về

self.subsetsRecur(current, sset[1:] /*== []*/) + self.subsetsRecur(current + [sset[0]], sset[1:] /*== []*/)

Đơn giản hơn, mỗi lần gọi lại subsetsRecur thì sset bị mất 1 phần tử đầu tiên. Dãy rỗng thì làm gì có phần tử đầu tiên?

Do vậy luôn phải kiểm tra sset để tránh lỗi khi đệ quy (vì dãy rỗng không thể slicing được -> không thể gọi đệ quy).

Ngoài ra, Python cũng báo lỗi khi đệ quy quá sâu. Mình không biết là khi bỏ if sset: ra có bị đệ quy quá sâu không (vì không thể đệ quy tiếp, mà cũng không trả về kết quả gì cả).

Thinh Minh Ha viết 14:14 ngày 01/10/2018

Anh có thể cho e hỏi thêm là current ở đoạn Code dùng để làm gì được không ạ

HK boy viết 14:07 ngày 01/10/2018

current giống như cái-gì-đó để kết quả cuối cùng.
Bạn đọc lại pic của thanhtrung2314, và cũng xem lại mục đích của bạn là gì khi code đoạn code trên.

Henry viết 14:02 ngày 01/10/2018

Mình có làm một video cho bạn đây.

Thinh Minh Ha viết 14:16 ngày 01/10/2018

Mình có làm một video cho bạn đây.

Thật sự không biết nói gì hơn ngoài từ CÁM ƠN. Cám ơn anh ! Cám ơn anh rất nhiều nhiều ạ

Bài liên quan
0