Jak zapewne wiesz, python ma listy. Ponieważ możesz nie wiedzieć, te listy mogą się zawierać.
a = []
a.append(a)
Są fajne i istnieje wiele ciekawych rzeczy, które możesz z nimi zrobić, ale nie możesz ich porównać.
a = []
a.append(a)
b = []
b.append(b)
a == b
Zadanie
Twoim zadaniem jest napisanie funkcji w Pythonie (lub dowolnym języku, który może bezpośrednio obsługiwać obiekty Pythona), który pobierze dwie listy, które mogą je zawierać i porówna je.
Dwie listy są równe, jeśli mają taką samą długość i nie istnieje taka sekwencja liczb, że indeksowanie obu list według tej sekwencji daje w wyniku dwa obiekty, które nie są równe w tej definicji równości. Wszystkie obiekty nie znajdujące się na liście zawarte na liście będą liczbami całkowitymi Pythona dla uproszczenia i powinny być porównane z wbudowaną równością Pythona dla liczb całkowitych.
Twój program nie powinien polegać na głębokości rekurencji Pythona w celu ustalenia, czy lista jest nieskończenie głęboka. To jest:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
To nie jest poprawny sposób ustalania, czy dwie listy są referencyjne.
Przypadki testowe
Zakłada zdefiniowanie funkcji 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