Como você deve saber, python possui listas. Como você talvez não saiba, essas listas podem se conter.
a = []
a.append(a)
Isso é legal e há muitas coisas interessantes que você pode fazer com elas, mas não pode compará-las.
a = []
a.append(a)
b = []
b.append(b)
a == b
Tarefa
Seu trabalho é escrever uma função no Python (ou qualquer linguagem que possa manipular objetos python diretamente) que pegue duas listas que possam se conter e as compare.
Duas listas são iguais se tiverem o mesmo comprimento e não existir uma sequência de números, de modo que a indexação de ambas as listas por essa sequência resulte em dois objetos que não sejam iguais nessa definição de igual. Todos os objetos que não constam de uma lista serão inteiros python por simplicidade e devem ser comparados com a igualdade interna de python para números inteiros.
Seu programa não deve contar com a profundidade de recursão do python para determinar se uma lista é infinitamente profunda. Isso é:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Não é uma maneira válida de determinar se duas listas são auto-referenciais.
Casos de teste
Supõe que você define uma função 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