Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在Python中使用递归查找列表中的序列拆分_List_Python 3.x_Recursion_Split_Sequence - Fatal编程技术网

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