【发布时间】:2017-07-16 20:06:42
【问题描述】:
我必须使用递归返回 Python 列表中的第二小数,并且没有循环。我所做的是创建了一个辅助函数,它返回列表中(最小的,第二小的)值的元组,然后我只需在我的 second_smallest 函数中使用 tuple[1]。
def s_smallest(L):
if(len(L) == 2):
if (L[0] >= L[1]):
return (L[1],L[0])
else:
return (L[0],L[1])
else:
first_smallest,second_smallest = s_smallest(L[1:])
if L[0] >= first_smallest and L[0] <= second_smallest:
return (first_smallest, L[0])
elif L[0] <= first_smallest:
return (L[0], first_smallest)
else:
return (first_smallest, second_smallest)
这可行,但现在我需要处理嵌套列表,所以s_smallest([1,2,[3,0]]) 应该返回(0,1)。我试过这样做:
if isinstance(L[0],list):
first_smallest,second_smallest = s_smallest(L[0])
else:
first_smallest,second_smallest = s_smallest(L[1:])
如果它是一个列表,则获取第一个最小值和第二个最小值,但我收到一条错误消息builtins.TypeError: unorderable types: int() >= list()。如何解决此问题以处理嵌套列表?
【问题讨论】:
-
错误的明显来源是您没有完成该代码的集成。如果 L[0] 是一个列表,那么您必须对其进行递归,然后继续使用 L[1] 进行处理。你不能再使用 L[0],因为它是一个列表,而不是一个整数。不过,你走在正确的轨道上。尝试类似
l0,l1 = s_smallest(L[0]); m0,m1=s_smallest(L[1:]);然后合并 l0,l1,m0,m1 -
另外,请注意在
len(L)==2时可能仍然涉及一两个列表的可能性(如您的示例中所示)。您可能应该一直递归,并处理None或 len=1 案例
标签: python algorithm list recursion