python中的递归调用导致IndexError:列表索引超出范围

时间:2015-12-22 04:28:30

标签: python recursion

我正在练习用不同语言编写各种排序函数。我使用递归调用在python中编写了一个冒泡排序,但我不知道如何正确终止递归。正如我现在所说,程序正确排序但超出了我的列表参数并触发错误:IndexError:列表索引超出范围(第29行)[即冒泡(randomList)]

import random
#create a list of 10 random ints between 0-99 to be sorted
def makeRandomList():
    unsortedList=[]
    for i in range(10):
        unsortedList.append(random.randrange(100))
    print unsortedList
    return unsortedList


def bubblesort(randomList):
    i=0
    while i<=len(randomList):
        if randomList[i] > randomList[i+1]:
            randomList[i], randomList[i+1] = randomList[i+1], randomList[i]
            i+=1
            if i<len(randomList):
                bubblesort(randomList)
            else: break
        else:
            i+=1
            #for testing purposes
            print randomList
    return randomList


randomList=makeRandomList()
sortedList=bubblesort(randomList)
print "sorted list: ", sortedList

4 个答案:

答案 0 :(得分:1)

此错误是根据最初发布的代码编辑的。

这条线是否符合您的期望?

randomList[-i]<[-(i+1)]

这里只是将元素randomlist[-i]与[ - (i + 1)]进行比较。 [ - (i + 1)]只是一个整数,而不是randomlist的元素。它应该读

randomList[-i]<randomlist[-(i+1)]

如果您要比较列表中的元素。

创建大小为10的随机列表的更有效方法:

创建未排序的整数列表时,请利用random.sample(),这样就不会浪费时间和空间。在您的情况下,random.sample(range(100), 10).

答案 1 :(得分:1)

我解决了我的问题。我的索引在列表的末尾运行(也就是说,当我是len(randomList)时,我的程序正在寻找len(randomList + 1)并且它没有在基本情况下终止,因为那时while循环是i&lt ; = len(randomList)当它应该是i&lt;(len(randomList)-1)。这是正确的解决方案:

def bubblesort(randomList):
    i=0
    while i<(len(randomList)-1):
        if randomList[i] > randomList[i+1]:
            randomList[i], randomList[i+1] = randomList[i+1], randomList[i]
            i+=1
            if i<(len(randomList)-1):
                bubblesort(randomList)
            else: break
        else:
            i+=1
            print randomList
    return randomList

答案 2 :(得分:0)

您的inOrder功能不起作用。我是一个作用于函数的变量,因此在开头设置i + = 1表示它不会被设置为下一个递归调用中的那个。

答案 3 :(得分:0)

你可以用它来增加你的递归通话量:

sys.setrecursionlimit(10000)

我还建议你试图避免使用递归方法,因为你有。

您应该遍历列表以获得最小值和最大值,然后尝试预测值的位置。因此,如果列表中的所选项目小于100,则将其置于位置10。 或者你可以检查它之前的值是否大于或小于它,如果它小于它,那么它会在它之后的值:):例如:

    Age = [10,11,20,9,10,2,1,3]

for X in range(0, len(Age)):
    if X < len(Age) - 1:
        if Age[X] > Age[X + 1]:
            Temp = Age[X + 1]
            Age[X + 1] = Age[X]
            Age[X] = Temp

print(Age)

输出为:[10, 11, 9, 10, 2, 1, 3, 20]

你希望有一个while循环围绕for循环:)