Như bạn có thể biết rất rõ python có danh sách. Như bạn có thể không biết những danh sách này có thể chứa chính họ.
a = []
a.append(a)
Đây là những điều thú vị và có rất nhiều điều thú vị bạn có thể làm với chúng, tuy nhiên bạn không thể so sánh chúng.
a = []
a.append(a)
b = []
b.append(b)
a == b
Bài tập
Công việc của bạn là viết một hàm bằng Python (hoặc bất kỳ ngôn ngữ nào có thể xử lý trực tiếp các đối tượng python) sẽ lấy hai danh sách có thể chứa chính chúng và so sánh chúng.
Hai danh sách bằng nhau nếu chúng có cùng độ dài và không tồn tại dãy số sao cho việc lập chỉ mục cả hai danh sách theo chuỗi đó dẫn đến hai đối tượng không bằng nhau theo định nghĩa này bằng nhau. Tất cả các đối tượng không có trong danh sách có trong danh sách sẽ là số nguyên python để đơn giản và nên được so sánh với đẳng thức dựng sẵn của python cho số nguyên.
Chương trình của bạn không nên dựa vào độ sâu đệ quy của python để xác định xem danh sách có sâu vô hạn hay không. Đó là:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Không phải là một cách hợp lệ để xác định nếu hai danh sách là tự tham khảo.
Tủ thử
Giả sử bạn xác định hàm equal
a = []
a.append(a)
b = []
b.append(b)
print(equal(a,b))
True
a = []
b = []
a.append(b)
b.append(a)
print(equal(a,b))
True
a = []
b = []
a.append(1)
a.append(b)
b.append(1)
b.append(a)
print(equal(a,b))
True
a = []
a.append(a)
b = [a]
print(equal(a,b))
True
a = []
b = []
c = []
a.append(b)
b.append(c)
c.append(a)
equal(a,b)
True
a=[1,[2]]
b=[1,[2,[1]]]
a[1].append(a)
b[1][1].append(b[1])
True
a = []
a.append(a)
b = [1]
b.append(a)
c = [1]
c.append([c])
print(equal(b,c))
False
a = []
b = []
a.append(1)
a.append(b)
b.append(a)
b.append(1)
print(equal(a,b))
False
a = []
b = []
a.append(a)
b.append(b)
b.append(b)
print f(a,b)
False