【发布时间】: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]),所以x是l[0],而不是l。 -
哦....我明白了....然后我不确定如何正确调用单独的函数,有什么建议可以解决吗?