2016-11-28 58 views
-1

我目前正在做一个项目,需要我创建一些在模块中构建的Pythons,而无需借助任何内置模块。我的程序创建了一个长度为500的元素,其随机数字范围为1,999。我的问题出现在我的find_max(数字)函数中。在列表中的第三个元素的循环停止

def find_max(numbers): 
    i = 0 
    stop = 0 
    a = i+1 
    count = 0 
    if numbers[1] > numbers[2]: 
      greatest = numbers[1] 
    elif numbers[2] > numbers[1]: 
      greatest = numbers[2] 
    while count != 500: 
      if greatest > numbers[i]: 
        i += 1 
        count += 1 
      elif numbers[i] > greatest: 
        greatest = numbers[i] 
        i += 1 
        count += 1 
      else: 
        count+=1 
    print("The greatest: "+str(greatest)) 
    mainmenu(numbers) 

当我在排序我的列表之前或之后使用它时,它总是会停在第三个元素上。我find_min(数字)功能是最大的镜像副本与< intstead的>,总是设法找到之前或排序名单后的最低值。我已经尝试在范围(len(list))中使用for count:作为我的条件为具有相同结果的循环。

OUTPUT:

请输入您的菜单选项:最大

最大:10

LIST(后排序):

请输入您的菜单选项:排序

[1,7,10,11,12,13,13,14,20,29,34,38,38,39,41,44,45,51,55,56,57,57,57,62,63 ,69,72,73,77,78,82,83,83,95,96,98,100,102 ,103,104,105,106,106,111,114,114,115,116,117,123,123,125,126,127,132,134,134,135,136,138,139,140,140 ,142,142,142,146,148,149,151,154,156,158,158,161,163,166,166,168,170,173,173,175,175,176,182,183,184 ,190,197,197,204,204,205,207,207,207,213,216,217,217,219,219,221,221,221,221,222,225,227,230,233,236 ,243,244,249,250,250,250,253,254,256,260,261,262,265,267,268,275,276,277,278,286,290,293,294,297,299,249,244,249,255,268,270,274,268,274,274,274,274,274,274,274,274,274 ,301,302,304,305,307,308,308,309,315,318,319,322,325,332,333,334,337,338,338,341,342,342,343,344,345 ,347,348,352,354,355,355,355,357,357,359,362,363,367,368,370,373,374,374,378,385,387,387,391,391,392号公报,393,399,401,403,409,417,418,419,419,421,421,424,424,428,428,430,431, ,441,446,447,449,450,450,452,454,456,457,457,457,457,459,463,464,467,470,470,471,475,475,476,478,479,以及其中之一或以上。 ,484,489,490,501,503,504,504,507,511,513,513,513,516,516,522,532,533,534,534,537,538,538,540,548,552,以及其中的一个或多个, ,557,557,562,563,563,564,572,573,574,576,577,579,583,583,584,587,588,589,592,592,592,594,595,596,598号公报中所公开的那些, ,601,602,604,605,605,606,606,607,617,617,619,622,622,625,626,627,629,631,634,636,637,642,642,643,643,以及632。 ,653,654,656,658,658,663,669,672,672,673,674,674,679,680,681,682,683,685,692,695,696,696,698,699,709中的任何一个或多个, ,709,710,710,711,717,727,727,735,740,741,743,746,754,754,755,757,764,765,765,768,769,773,773,783,786,及其组合,788,791,792,792,793,798,800,803,803,809,809,809,813,813,813,814,815,815,816,817,817,819,821,822,823,822,823,813,813,813,813,813,813,814,815,815,816,817,817,819,821,822,823, ,824,824,826,827,829,829,830,830,831,831,834,83​​5,839,840,841,841,842,842,842,843,843,843,844,850,853和834。 ,854,863,863,864,868,869,870,875,877,879,880,880,882,884,884,886,887,887,889,893,894,896,896,897,897,以及其它的一些实施例中, ,899,901,903,903,903,905,906,909,910,913,916,916,917,917,919,920,920,921,922,922,923,926,926,926,927,以及其中,所述第一和第二分支,928,931,932,932,935,935,936,937,938,943,949,951,951,953,954,956,958,958,959,960,966,974,974,975,976,973,931,932,932,935, ,978,979,983,984,987,991,993,993,994,995,998,999]

UPDATE:

下面是适用于问题的代码:

def initial(): 
    numbers = [] 
    i = 0 
    while i <= 499: 
      temp = random.randint(1,999) 
      numbers.append(temp) 
      i += 1 
    return numbers 

def find_min(numbers): 
    i = 0 
    if numbers[1] < numbers[2]: 
      least = numbers[1] 
    elif numbers[2] < numbers[1]: 
      least = numbers[2] 
    for element in range(len(numbers)): 
      if least < numbers[i]: 
        i += 1 
      elif numbers[i] < least: 
        least = numbers[i] 
        i += 1 
    print("The lowest: "+str(least)) 
    mainmenu(numbers) 
+1

对于你的学习,这是完全可以用调试器解决的(https://docs.python.org/2/library/pdb.html)如果你自己找出原因,它会延长。 – Mai

+2

你并不需要索引来解决这个问题。 '数字中的数字:'将迭代每个数字。 –

+0

有几个问题。使用笔和纸以及测试装置浏览代码。如果数字[1] ==数字[2],哪个初始值最大呢?如果数字[i] ==最大,你的while循环会发生什么?我想你会发现你的测试数据对于第一批数字可能具有相同的值。 – Kif

回答

1

我与天气斗争来回答这个问题,并有可能剥夺你计算出它的价值。不过,我认为看到一种更干净的方式来做你正在努力完成的事情也是有价值的。通过查看其他代码,我学到了很多东西。你决定是否要使用这个或通过你自己的工作。

>>> def find_max(numbers): 
    greatest = numbers[0] 
    for x in numbers: 
     if x > greatest: 
      greatest = x 
    return greatest 

>>> find_max([3,400,200,100,500,250]) 
500 

>>> find_max([250,500,100,200,400,3]) 
500 

请注意,python会自动遍历数字 - 你不需要管理增量。在这种情况下,这与您在其他语言的for-each循环中看到的内容类似,如果您想查看它。

另请注意,比较逻辑可以更容易。对于这些事情来说,这是一种非常常见的模式,所以它可能值得您使用这种方法。

+0

谢谢,这是一个非常有用的解决方案。当我开始工作时,我正忙于完成这项任务,即使对我自己而言,我的逻辑也很难遵循,所以这非常有帮助。我主要是问我的程序在哪里失败,因为我无法理解为什么这段时间甚至是我使用的循环失败。 –

1

您没有增加您的清单索引,i。我发现这个问题有一个简单的打印

while count != len(numbers): 
     print (count, i, numbers[i], greatest) 
     if greatest > numbers[i]: 

这显示了困难,调用:

test = [3, 1, 4, 1, 5, 9] 
find_max(test) 

输出:

0 0 3 4 
1 1 1 4 
2 2 4 4 
3 2 4 4 
4 2 4 4 
5 2 4 4 
The greatest: 4 

首先,您的最终其他子句不会增加i。您不需要两个并行运行的计数器:使用计数i,而不是两者。

第二,因为你事先知道你走了多少次循环时,使用循环,而不是一个

for i in range(len(numbers)): 

更妙的是,因为你并不真正需要要知道哪里最大因素是在列表中,只是遍历列表(我看到马克Tolonen也创下这个在评论):

for element in numbers: 

最后,如果语句使得这个更改不会更新中的更新计数器,那么您就没有所有这些令人讨厌的冗余代码。

相关问题