如何使用分而治之将列表分成左右两侧?

Posted

技术标签:

【中文标题】如何使用分而治之将列表分成左右两侧?【英文标题】:How do I separate a list into left and right sides using divide and conquer? 【发布时间】:2021-07-12 00:05:48 【问题描述】:

我正在尝试不断地将列表分成左右两侧,直到无法再制作一半列表并每次打印它们。我也尝试根据偶数或奇数迭代选择左侧或右侧。

代码:

low = 0
high = n
i=0
a = len(L1)
b = len(L2)
while a > 0 and b>0:
    
    mid = (low + high)// 2

    if i%2==0:
        print(L[low:mid])
        low = mid + 1
        print(L[mid:high])
    else:
        print(L[low:mid])
        high = mid - 1
        print(L[low:high])
        print(L[mid:high])
    i=i+1

L = [1, 2, 3, 4, 5]
# should print:
 [1, 2, 3]
 [4, 5]
 [1, 2]
 [3]
 [4]
 [5] 

请帮忙

【问题讨论】:

【参考方案1】:

这样做的自然方法是将分割和打印操作放在一个函数中,以便您可以在子列表上递归调用该函数,直到达到长度为 1 的列表:

def divide(L):
    """Recursively divide list L and print the sublists at each level."""
    
    if len(L) <= 1:  # base case: nothing left to do
        return()
    
    mid = (len(L) + 1) // 2  # if odd length, left sublist will be longer 
    L_left = L[:mid]  # left sublist
    L_right = L[mid:]  # right sublist
    print(L_left)
    print(L_right)
    
    # recursive function calls to further divide the sublists
    divide(L_left)  
    divide(L_right)
    
    return()
    
L = [1, 2, 3, 4, 5]
divide(L)
[1, 2, 3]
[4, 5]
[1, 2]
[3]
[1]
[2]
[4]
[5]

请注意,这并不能解决您的想法

根据偶数或奇数迭代选择左侧或右侧

因为我不确定你的意思。

【讨论】:

以上是关于如何使用分而治之将列表分成左右两侧?的主要内容,如果未能解决你的问题,请参考以下文章

使用分而治之的最大子阵列产品有人吗?

快速排序

使用分而治之的最大连续和

算法知识详解快速排序算法

递归分治最长运行

归并排序