List 如何在Python中使用递归查找列表中的序列拆分
我需要为学校填写此代码。List 如何在Python中使用递归查找列表中的序列拆分,list,python-3.x,recursion,split,sequence,List,Python 3.x,Recursion,Split,Sequence,我需要为学校填写此代码。 程序应该在列表中找到序列拆分的索引。 例如,输入是这样一个列表 [66, 81, 83, 96, 13, 19, 30, 41, 44, 57] 正确的输出应为4(序列中断时的数字索引-96) 我的函数能够找到拆分,但我不知道如何返回该拆分的索引。它总是返回错误的答案 这是我的密码: def findSplit( list ): if len(list)%2 == 0: if list[(len(list)//2)-1] == list[0]
程序应该在列表中找到序列拆分的索引。 例如,输入是这样一个列表
[66, 81, 83, 96, 13, 19, 30, 41, 44, 57]
正确的输出应为4(序列中断时的数字索引-96)
我的函数能够找到拆分,但我不知道如何返回该拆分的索引。它总是返回错误的答案
这是我的密码:
def findSplit( list ):
if len(list)%2 == 0:
if list[(len(list)//2)-1] == list[0]:
return 1
elif list[(len(list)//2)-1]<list[0]:
return findSplit(list[:(len(list)//2)]) - len(list)//2
elif list[(len(list)//2)-1]>list[0]:
return findSplit(list[(len(list)//2)-1:]) + len(list)//2
elif len(list)%2 != 0:
if list[(len(list)//2)]<list[0]:
return findSplit(list[:(len(list)//2)+1]) - len(list)//2
elif list[(len(list)//2)]>list[0]:
return findSplit(list[(len(list)//2):]) + len(list)//2
if __name__ == "__main__":
list = [ 66, 81, 83, 96, 13, 19, 30, 41, 44, 57 ]
line = input().strip().split()
if line != []:
list = []
for x in line:
list.append( int( x ) )
print(findSplit( list ))
def findSplit(列表):
如果len(列表)%2==0:
如果list[(len(list)//2)-1]==list[0]:
返回1
elif列表[(len(list)//2)-1]列表[0]:
return findSplit(list[(len(list)//2)-1:]+len(list)//2
elif len(列表)%2!=0:
如果列表[(len(list)//2)]列表[0]:
返回findSplit(list[(len(list)//2):])+len(list)//2
如果名称=“\uuuuu main\uuuuuuuu”:
列表=[66,81,83,96,13,19,30,41,44,57]
行=输入().strip().split()
如果行!=[]:
列表=[]
对于直线中的x:
list.append(int(x))
打印(findSplit(列表))
首先,最重要的是不要命名任何变量列表
,因为它们会覆盖内置函数。我已在下面的代码中将名称更改为lst
除了一个小错误,您的代码很好,当您发现分割是前一半时,您不需要减去另一半的长度
return findSplit(lst[:(len(list)//2)+1]) # THIS MUCH IS ENOUGH!
这是因为您在前半部分返回索引,因此索引从这半部分开始。如果你减去,你就变成负数了。在您的特定情况下,您使用5
(另一个分割的长度)减去4
(正确的值),因此您得到的答案是错误的-1
,即4-5
编辑后的代码可以写成
def findSplit( lst ):
if len(lst)%2 == 0:
if lst[(len(lst)//2)-1] == lst[0]:
return 1
elif lst[(len(lst)//2)-1]<lst[0]:
return findSplit(lst[:(len(lst)//2)])
elif lst[(len(lst)//2)-1]>lst[0]:
return findSplit(lst[(len(lst)//2)-1:]) + len(lst)//2
elif len(lst)%2 != 0:
if lst[(len(lst)//2)]<lst[0]:
return findSplit(lst[:(len(lst)//2)+1])
elif lst[(len(lst)//2)]>lst[0]:
return findSplit(lst[(len(lst)//2):]) + len(lst)//2
但是,我不理解代码的第二部分;) 非常感谢您的意愿!;)我的代码的第二部分很简单。你们也可以输入你们自己的序列,若你们不输入任何东西,程序将使用预定义的列表进行操作。您的代码是功能性的,但仅适用于预定义的列表。。。如果输入不同的顺序,结果将不正确。这就是我的问题。我需要使用各种输入返回正确答案的功能齐全的代码,但我心情不好。但无论如何,谢谢你!:)@AdrianHrinko我试图更正您的代码。:)我会尽快给出一个更好的答案:)
>>> findSplit([ 66, 81, 83, 96, 13, 19, 30, 41, 44, 57 ])
4