伙计们,我写了一个函数来测试两个输入(a和b)是否具有相同的数据结构,这样:
print same_structure([1, 0, 1], [a, b, c])
#>>> True
#print same_structure([1, [0], 1], [2, 5, 3])
>>> False
#print same_structure([1, [2, [3, [4, 5]]]], ['a', ['b', ['c', ['d', 'e']]]])
>>> True
#print same_structure([1, [2, [3, [4, 5]]]], ['a', ['b', ['c', ['de']]]])
>>> False
这个函数(在我的实现中)使用递归。我是递归的初学者,我仍然难以递归思考。另外,为了避免欺骗答案,我想使用我自己的(杂乱的)代码并通过它学习使用递归调用(使用此代码行:'same_structure return(a [i],b [e])' )。有人可以在下面的代码中展示如何正确使用递归吗? 在此先感谢您的帮助!!!
def is_list(p):
return isinstance(p, list)
def same_structure(a,b):
if not is_list(a) and not is_list(b):
print '#1'
return True
else:
if is_list(a) and is_list(b):
print '#2'
if len(a) != len(b):
print '#3'
return False
if len(a) == len(b):
print '#4'
for e in range(len(a)):
print 'e = ', e, 'a[e]= ', a[e], 'b[e]=', b[e]
return same_structure(a[e], b[e])
else:
return False
答案 0 :(得分:2)
以下作品:
def same_structure(a, b):
if isinstance(a, list) and isinstance(b, list) and len(a) == len(b):
return all(same_structure(A, B) for A, B in zip(a, b))
return (not isinstance(a, list) and not isinstance(b, list))
编写递归函数时,首先需要提出基本情况,只需返回一个值而不是调用任何递归。这里的基本案例是以下条件之一:
a
是一个列表而b
不是,反之亦然:return False a
和b
都是列表,但它们的长度不同:return False a
或b
都不是列表:return True 如果a
和b
都是列表并且它们具有相同的长度,我们现在需要递归地检查这些列表的每个元素。 zip(a, b)
提供了一种方便的方法来迭代每个列表中的元素,如果任何两个子元素的same_structure()
的结果为False,我们希望整个函数返回False。这就是使用all()
的原因,如果您不熟悉all()
,它对于以下循环是等效的(但更有效):
match = True
for A, B in zip(a, b):
if not same_structure(A, B):
match = False
break
return match
以下是如何在不改变太多的情况下重写函数的方法,逻辑实际上与我的解决方案非常相似,但是在print '#4'
之下,你过早地从那个循环返回:
def same_structure(a,b):
if not is_list(a) and not is_list(b):
print '#1'
return True
else:
if is_list(a) and is_list(b):
print '#2'
if len(a) != len(b):
print '#3'
return False
if len(a) == len(b):
print '#4'
for e in range(len(a)):
print 'e = ', e, 'a[e]= ', a[e], 'b[e]=', b[e]
if not same_structure(a[e], b[e]):
return False
return True
else:
return False
答案 1 :(得分:2)
尝试此解决方案,它适用于您的所有示例,它以递归的函数式编程风格编写,但不使用zip
,all
等仅切片来减小列表的大小在每一步:
def same_structure(a, b):
if a == [] or b == []:
return a == b
elif is_list(a[0]) != is_list(b[0]):
return False
elif not is_list(a[0]):
return same_structure(a[1:], b[1:])
else:
return same_structure(a[0], b[0]) and same_structure(a[1:], b[1:])
答案 2 :(得分:1)
你只是在做第一次递归通话,因为你马上就回来了。
如果我理解你想做什么,你需要调用带有子元素的same_structure,并检查它的返回值(不是立即返回)。如果任何调用的结果为false,则返回false,否则返回true。