2017-04-23 280 views
1

如何在序列中查找最大值?为什么这个错误“列表索引超出界限”?

k=[10,7,5,9,2] 
def gr(k): 
    i=0 
    j=1 
    for x in k: 
     if k[i]>k[j]: 
      x=k[i] 
      j+=1 
     else: 
      x=k[j] 
      i+=1 
    print x 

为什么把最大的没有。在列表中的第一个位置是索引超出了界限的错误,否则它运行完美。我知道各种其他方法来做到这一点,如max和所有,但我想纠正这一点。

+1

您正在更改循环中间的循环变量'x'的值,这绝不是一个好主意。也给有意义的变量名称,以便你的意图变得更清晰。 –

+0

重新创建'max()'? –

+0

NOPE!只是弄清楚它是如何工作的。 –

回答

1

让我们集中于什么问:

为什么把最大的没有。在列表中的第一个位置是给出索引超出界限的错误,否则它运行完美?

的答案很简单:

该指数ij是在启动01。如果列表中的第一个项目最大,则列表j中的每个项目都增加1,导致列表中最后一个项目的索引超出界限。

如果最大的项目是不是第一个j将增加一个最大n-1倍,其中n是列表k的长度,因此,指数走出束缚的错误不能“成就”。

这里不改变使用这样的功能,而不是max(k)搜索最大的病“逻辑”修复:

def gr(k): 
    i=0 
    j=1 
    for x in k: 
     if j > len(k)-1: 
      x=k[i] 
      break 
     if k[i]>k[j]: 
      x=k[i] 
      j+=1 
     else: 
      x=k[j] 
      i+=1 
    print (x) 

顺便说一句:在stackexchange他们为有这样的一种乐趣人民创造问题https://codegolf.stackexchange.com

我们处于stackoverflow ...

这里完整起见:

此功能不能总是找到一个列表

最大值什么挑战好奇地发现它返回的情况下,错误的价值:)

(如果您喜欢,您可以在下面的评论中为此挑战提供“解决方案”)

我下面的评论的请求表明,当以上功能并没有提供正确的结果:

gr([1, 2, 3, 4, 5]) 
gr([4, 1, 7, 3, 9]) 

给出:

4 
7 

它应该给5 9代替。

增编答:在评论帖子的启发我已经有点进一步提高最后在提供了改进的功能的版本的意见,所以它现在可以正确地覆盖了所有可能的情况:

def ki(k): 
    i=0 
    j=1 
    y=k[j-1] 
    for x in k: 
     if i > i + j: 
      y=k[i] 
      break 
     if k[j] > y: 
      y=k[j] 
      i+=2 
     else: 
      x=k[j-1] 
      i+=3 
     i-=1 
     j+=1 
     if j > len(k)-1: 
      break 
    if x < x - j: 
     print(x) 
    else: 
     print(y) 

不要采取上述严重,但不要笑!没有幽默在stackoverflow!

附录B:现在的解决方案,该解决方案......所有上面的代码,如果你只是扔掉所有这一切都没有必要,在那里为制造混乱唯一的缘故语句和变量可表示如下:

def ki(k): 
    y=k[0] 
    for x in k[1:]: 
     if x > y: y=x 
    print(y) 

知道了这一点,你认识的实际挑战:编写的代码,不会完全一样的小片以上,但是汗牛充栋,因为混乱和难以遵循它实际做尽可能...

+0

Thanx为解决方案加上嘲讽。我知道MAX,减少和各种其他方式来做到这一点先生smarty。当我们在列表中有连续的系列的时候,我们会使用 –

+0

。 –

+0

已经回答您的挑战....这里是解决这一画质GR(K): I = 0 J = 对于x在k-: 如果j> LEN(k)的-1: X = K [I] 断裂 如果k [I]> = K [j]的: X = K [I] Y = K [j]的 J + = 1 否则: Y = K [j]的 I + = 1 如果x> y: print x else: print y –

0

如果用1初始化j,for循环将执行n次,n是数组的长度。考虑到第一个元素是最大的,根据你的代码,j将在每次迭代时递增。

因此在最后一次迭代中,j将增加n - 1次,现在等于n

由于数组的索引从0开始,索引的有效范围是从0到n - 1

+0

你能提出解决方案吗?不要改变方法。我知道使用Reduce函数的其他方法。 –

+0

您的算法实际上并不正确。你能解释为什么你要增加'i'或'j'吗?要找到最大的数字,您可以简单地跟踪迄今为止最大的数字的指数。例如,你可以用0来初始化这个索引,然后迭代数组,并且每当你发现一个比“迄今最大的索引”中的元素大的元素时,你更新“到目前为止最大的索引”。在迭代结束时,您只需返回“迄今为止最大的索引”中的元素。 –

0

以下实施方式避免了索引变量ij。 如果序列为空或仅包含一个元素,则不需要进行比较。如果n是序列的长度,则比较的数量是n-1。因此,实现在第二个元素处开始循环。

我已将打印功能移到了该功能之外。

k = [10, 7, 5, 9, 2] 

def gr(k): 
    if not k: 
     return None 

    if len(k) == 1: 
     return k[0] 

    result = k[0] 
    for x in k[1:]: 
     if x > result: 
      result = x 

    return result 

print(gr(k)) 

结果:

10 

顺便说一句,这重创内置max

+0

'返回K [0]' “打破”了代码的不合逻辑,因此并不是真正的解决方案...... – Claudio