Comme vous le savez très bien, python a des listes. Comme vous ne le savez peut-être pas, ces listes peuvent se contenir.
a = []
a.append(a)
Ce sont cool et il y a beaucoup de choses intéressantes que vous pouvez faire avec eux, mais vous ne pouvez pas les comparer.
a = []
a.append(a)
b = []
b.append(b)
a == b
Tâche
Votre travail consiste à écrire une fonction en Python (ou tout autre langage capable de gérer directement des objets python) qui prendra deux listes qui peuvent se contenir et les comparer.
Deux listes sont égales si elles sont de la même longueur et qu'il n'existe pas de séquence de nombres telle que l'indexation des deux listes par cette séquence entraîne deux objets qui ne sont pas égaux selon cette définition d'égalité. Tous les objets non list contenus dans une liste seront des entiers python pour plus de simplicité et devraient être comparés avec l'égalité intégrée de python pour les entiers.
Votre programme ne doit pas s'appuyer sur la profondeur de récursivité de python pour déterminer si une liste est infiniment profonde. C'est:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
N'est pas un moyen valable de déterminer si deux listes sont auto-référentielles.
Cas de test
Suppose que vous définissez une fonction 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