如何在 Python 中使用递归查找列表中的序列拆分

How to find sequence split in list using recursion in Python

我需要为学校完成这个代码。
该程序应该在列表中找到序列拆分的索引。 例如,输入是这样的列表

[66, 81, 83, 96, 13, 19, 30, 41, 44, 57]

正确的输出应该是4(序列被中断的数字索引 - 96)

我的函数能够找到拆分,但我不知道如何 return 该拆分的索引。它总是 return 错误答案。

这是我的代码:

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 ))

首先,也是最重要的一点,不要命名任何变量 list,因为它们会覆盖内置函数。我在下面的代码中将名称更改为 lst


你的代码很好,除了一个小错误,当你发现分割是前半部分时,你不需要减去另一半的长度。

return findSplit(lst[:(len(list)//2)+1])  # THIS MUCH IS ENOUGH! 

这是因为您在前半部分返回索引,因此索引从这一半本身开始。如果你减去,你就会变成负数。在您的特定情况下,您将 4 (正确值)与 5 (另一个拆分的长度)相减,因此您得到错误的答案 -14-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 

现在当我们打印输出时,我们得到了正确的值。

>>> findSplit([ 66, 81, 83, 96, 13, 19, 30, 41, 44, 57 ])
4 

虽然我不明白你代码的第二部分 ;)