Come forse saprai, Python ha delle liste. Come forse non sapete, queste liste possono contenere se stesse.
a = []
a.append(a)
Questi sono fantastici e ci sono molte cose interessanti che puoi fare con loro, tuttavia non puoi confrontarli.
a = []
a.append(a)
b = []
b.append(b)
a == b
Compito
Il tuo compito è quello di scrivere una funzione in Python (o qualsiasi linguaggio in grado di gestire direttamente gli oggetti Python) che prenderà due elenchi che possono contenere se stessi e confrontarli.
Due liste sono uguali se hanno la stessa lunghezza e non esiste una sequenza di numeri tale che l'indicizzazione di entrambe le liste in base a quella sequenza si traduca in due oggetti che non sono uguali in questa definizione di uguale. Tutti gli oggetti non di elenco contenuti in un elenco saranno interi di Python per semplicità e dovrebbero essere confrontati con l'uguaglianza integrata di Python per gli interi.
Il tuo programma non dovrebbe fare affidamento sulla profondità di ricorsione di Python per determinare se un elenco è infinitamente profondo. Questo è:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Non è un modo valido per determinare se due elenchi sono autoreferenziali.
Casi test
Presuppone che tu definisca una funzione 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