【问题标题】:recursion function that take a list and return a sorted list采用列表并返回排序列表的递归函数
【发布时间】:2016-11-01 02:47:32
【问题描述】:

我正在研究排序函数,这是一个递归函数,它接受一个列表并返回一个排序列表。(使用递归是一项要求)。

def separate(p : callable, l : [object]) -> ([object],[object]):
    if l == []:
        return([],[])
    else:
        if p(l[0]):
            return (separate(p, l[1:])[0]+[l[0]],separate(p, l[1:])[1])
        else:
            return (separate(p, l[1:])[0], separate(p, l[1:])[1]+[l[0]])

def sort(l : [object]) -> [object]:

    z = separate((lambda x: [y > x[0] for y in x]),l)
    return sort(z[0]) + sort(z[1])

单独的函数传递了一个谓词和一个列表;它返回一个 2 元组,其 0 索引是参数列表中谓词返回 True 的所有值的列表,其 1 索引是参数列表中谓词返回 False 的所有值的列表。例如:

separate((lambda x:x>=0),[1,-3,-2,4,0,-1,8])

返回

([1,4,0,8],[-3,-2,-1])

排序函数调用分离函数将列表分成两个列表。 sort 中的 lambda 函数是比较列表中的元素是否大于列表中的第一个元素。然后,递归地对这两个列表中的每一个调用 sort 并返回一个列表,其中包含第一个列表(较小的列表)中的排序值,后跟用于分隔列表的值,然后是第二个列表中的排序值(较大的)

sort([4,5,3,1,2,7,6]) 会先调用 separate 来计算列表 [3,1,2] 和 [5,7,6](注意 4,列表中的第一个值,用于进行分离,不在任何一个列表中)排序时将是 [1,2,3] 和 [5,6,7],导致返回列表

[1,2,3,4,5,6,7] 

(将 4 放入结果列表中的正确位置)。

我已经测试了我的单独功能,它工作正常。

现在,我尝试编写函数排序,它显示'int'对象不可迭代,我在下面添加了错误:

29 # Test sort
30 *Error: sort([1,2,3,4,5,6,7]) raised exception TypeError: 'int' object is not iterable
31 *Error: sort([7,6,5,4,3,2,1]) raised exception TypeError: 'int' object is not iterable
32 *Error: sort([4,5,3,1,2,7,6]) raised exception TypeError: 'int' object is not iterable
33 *Error: sort([1,7,2,6,3,5,4]) raised exception TypeError: 'int' object is not iterable
36 *Error: l = sort(l) raised exception TypeError: 'int' object is not iterable
37 *Error: l -> [8, 5, 9, 4, 29, 28, 11, 19, 7, 15, 25, 6, 12, 10, 22, 17, 21, 3, 27, 23, 1, 20, 13, 2, 30, 16, 26, 24, 18, 14] but should -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

我不知道为什么会出现这个错误,有人可以帮我修复我的排序功能吗?非常感谢。

【问题讨论】:

  • 递归函数需要测试基本情况,因此它们不会无限递归。您的 sort 函数没有经过测试。
  • 你这是什么意思?
  • sort() 函数如何知道何时停止递归?
  • 不过,这不是错误的原因。错误是因为您的lambda 函数在x 上使用了列表理解,但您调用了p(l[0]),所以xl[0],而不是l
  • 哦....我明白了....然后我不确定如何正确调用单独的函数,有什么建议可以解决吗?

标签: python recursion


【解决方案1】:

首先,您的separate() 函数一团糟。你重新计算separate(p, l[1:]),只是为了索引它两次,而不是使用局部变量:

return (separate(p, l[1:])[0] + [l[0]], separate(p, l[1:])[1])

您的sort() 例程需要一个基本案例;您无法获取空列表的第一个元素;你抓住了错误列表的第一个元素;你违反了你自己的谓词函数设计的逻辑,让它处理整个列表而不是一个元素!

这是您的代码的返工,试图解决上述问题并稍微清理样式:

def separate(predicate: callable, array: [object]) -> ([object], [object]):

    if not array:
        return list(), list()

    positive, negative = separate(predicate, array[1:])

    if predicate(array[0]):

        return [array[0]] + positive, negative

    return positive, [array[0]] + negative


def sort(array: [object]) -> [object]:

    if not array:
        return array  # avoid next statement if array is empty

    first = array[0]

    lesser, greater = separate(lambda x: x < first, array[1:])

    return sort(lesser) + [first] + sort(greater)


print(sort([4, 5, 3, 1, 2, 7, 6]))

根据需要,它返回:

[1, 2, 3, 4, 5, 6, 7]

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2021-09-19
    相关资源
    最近更新 更多