如您所知,python有列表。您可能不知道这些列表可以包含自己。
a = []
a.append(a)
这些很酷,您可以使用它们做很多有趣的事情,但是您无法将它们进行比较。
a = []
a.append(a)
b = []
b.append(b)
a == b
任务
您的工作是用Python(或可以直接处理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
17
作为一个侧面说明潜在的选民:请注意,一般语言的具体挑战是令人难以接受的 ,除了在某些情况下(如那些只在某些语言有趣的任务)。IMO,这是针对特定语言的挑战的绝妙示例。
—
DJMcMayhem
@WheatWizard这还不够—嵌套列表的长度也必须相同。
—
xnor
@WheatWizard您实际上可以比较它们。在Python中,如果它们不相等,则只会得到“超出了递归限制”。tio.run/nexus/…– mbomb007
—
'04
@ mbomb007那是因为python默认情况下会比较引用。如果您有两个具有不同引用的相同对象,它将失败,因此将面临挑战。
—
小麦巫师
您可以将挑战扩展到列表可以包含自身的所有语言吗?
—
CalculatorFeline