如何在序列中找到最大的?
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和all,但我想纠正这个。
答案 0 :(得分:1)
让我们专注于被问到的问题:
为什么选择最大的号码。在列表的第一个位置给出索引超出范围的错误,否则它运行得很好?
答案很简单:
索引i
,j
位于开始0
和1
。如果列表中的第一个项目是最大的,则列表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)
顺便说一下:在Stack Exchange上,他们为那些喜欢这类问题的人们创建https://codegolf.stackexchange.com。
我们正处于Stack Overflow。
这里为了完整起见:
此功能无法始终在列表中找到最大值
挑战奇怪的是找到一个错误值的情况:):
(如果您愿意,可以在下面的评论中为此挑战提供“解决方案”)
我在评论中跟踪请求,以显示上述函数未提供正确的结果:
gr([1, 2, 3, 4, 5]) gr([4, 1, 7, 3, 9])
给出:
4
7
应该给5和9代替。
ADDENDUM A:受到评论中帖子的启发,我对评论中的最后一个提供了进一步改进,提供了该函数的改进版本,以便它现在可以正确涵盖所有可能的情况:
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没有幽默!
ADDENDUM B:现在是解决方案的解决方案。以上所有代码,如果您只是丢弃所有不必要的语句和变量而只是为了产生混淆,可以表示如下:
def ki(k):
y=k[0]
for x in k[1:]:
if x > y: y=x
print(y)
知道这一点你就认识到了真正的挑战:编写与上面的小部件完全相同的代码,但是体积庞大,令人困惑,并且难以理解它实际所做的事情......
答案 1 :(得分:0)
如果用{1}初始化j
,for循环将执行n
次,n
是数组的长度。考虑到第一个元素是最大的,根据您的代码,j
将在每次迭代时递增。
因此,在上一次迭代中,j
将增加n - 1
次,现在等于n
。
由于数组的索引从0开始,因此索引的有效范围是从0到n - 1
。
答案 2 :(得分:0)
以下实现避免了索引变量i
和j
。
如果序列为空或仅包含一个元素,则不需要进行比较。如果 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
。