Як ви дуже добре знаєте, у python є списки. Як ви можете не знати, ці списки можуть містити себе.
a = []
a.append(a)
Це круто і є багато цікавого, що ви можете зробити з ними, однак ви не можете їх порівняти.
a = []
a.append(a)
b = []
b.append(b)
a == b
Завдання
Ваше завдання - написати функцію в Python (або будь-яку мову, яка може обробляти об'єкти python безпосередньо), яка візьме два списки, які можуть містити себе та порівняти їх.
Два списки рівні, якщо вони однакової довжини і не існує послідовності чисел, така що індексація обох списків за цією послідовністю призводить до двох об'єктів, які не є рівними за цим визначенням рівними. Усі об'єкти, що не містять списку, містяться в списку, будуть цілими числами python для простоти і повинні порівнюватися з вбудованою python в рівності для цілих чисел.
Ваша програма не повинна покладатися на глибину рекурсії пітона, щоб визначити, чи список нескінченно глибокий. Тобто:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Не є правильним способом визначення, чи є два списки самореференційними.
Тестові шафи
Передбачає, що ви визначаєте функцію 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