【发布时间】:2014-12-29 22:30:48
【问题描述】:
我正在尝试使用递归查找列表中的最大元素。 输入需要是实际列表、左索引和右索引。
我写了一个函数,但不明白为什么它不起作用。我画了递归树,在脑海中运行了列表示例,这很有意义,这就是为什么现在更难找到解决方案的原因! (它基本上是在和自己战斗)。
我知道这很丑,但尽量忽略它。我的想法是在每次递归调用时将列表分成两半(这是必需的),而左侧索引将保持为 0,右侧将是新减半列表的长度,减去 1。
对该函数的第一次调用将来自尾部函数。
感谢您的帮助,我希望我没有错过一些非常愚蠢的东西,甚至更糟 - 甚至没有接近! 顺便说一句 - 没有使用切片来切割清单,因为我不允许。
def max22(L,left,right):
if len(L)==1:
return L[0]
a = max22([L[i] for i in range(left, (left+right)//2)], 0 , len([L[i] for i in range(left, (left+right)//2)])-1)
b = max22([L[i] for i in range(((left+right)//2)+1, right)], 0 ,len([L[i] for i in range(left, (left+right)//2)])-1)
return max(a,b)
def max_list22(L):
return max22(L,0,len(L)-1)
输入示例 - 对于 max_list22([1,20,3]),输出将为 20。
【问题讨论】:
-
能否请您添加一个特定输入列表的示例以及您收到的意外结果/错误消息?
-
为什么不用
L[left:(left+right)//2]而不是[L[i] for i in range(left, (left+right)//2)]?太难读了? -
这不是你布置的作业吗?
-
anmol,它是,但我尝试了很多次,我正在寻求帮助。我是学生,我所做的一切都是功课):
-
和 Rawing,我不能使用切片,我知道它看起来很难看,只是搜索以了解我的代码有什么问题