是否存在将每个列表元素分离到自己的列表中的非递归方式?

时间:2012-01-16 10:41:26

标签: python list recursion elements


我在合并排序上查看维基百科的伪代码(以及sortvis.org和sorting-algorithm.com等其他网页),并看到合并的准备工作使用了递归。 我很想知道是否有一种非递归方式。
也许像for each i element in list, i=[i-th element]

我认为递归保持最小 - 因为它是不受欢迎的,因此我想到了这个问题。

以下是维基百科合并排序的递归部分的伪代码示例:

function merge_sort(list m)
    // if list size is 1, consider it sorted and return it
    if length(m) <= 1
        return m
    // else list size is > 1, so split the list into two sublists
    var list left, right
    var integer middle = length(m) / 2
    for each x in m up to middle
         add x to left
    for each x in m after or equal middle
         add x to right
    // recursively call merge_sort() to further split each sublist
    // until sublist size is 1
    left = merge_sort(left)
    right = merge_sort(right)

3 个答案:

答案 0 :(得分:3)

Bottom-up merge sort是合并排序的非递归变体。

有关更详细的伪代码实现,请参阅此wikipedia page

答案 1 :(得分:1)

middle = len(lst) / 2
left = lst[:middle]
right = lst[middle:]

列表切片工作正常。

答案 2 :(得分:1)

顺便说一下 - 递归本身并不是不可取的

如果你的堆栈空间有限(你是否害怕 stackoverflow ?;-)),或者在某些情况下函数调用的时间开销非常令人担忧,那么递归是不可取的。

在大多数情况下,这些条件并不成立;代码的可读性和可维护性将更具相关性。在我看来,在递归表达时,合并排序等算法更有意义。