在Class函数中导致IndexError的递归调用

时间:2018-05-13 03:29:58

标签: python class oop recursion

我的计划的目标是让计算机询问用户问题,并返回符合其需求的计算机的一些规格。现在我正在研究QuestionAsker,正如类名所示,它负责向用户提问。我一直挂在AskQuestion()函数的第四行。在我告诉你这个问题之前,先看一下代码:

from question import Question

class QuestionAsker():
    questions = [
        Question("At minimum, what should your game be running on?", ["Low", "Medium", "Ultra"]),
        Question("On a scale of 1-3, how much flair do you want on your computer?", ["Low", "Medium", "Ultra"]),
        Question("Money doesn't grow on trees. How much money is in your budget?", ["$500", "$1000", "$2000+"]),
        ]

    index = 0   
    def AskQuestion(self):
        userInputForQuestion = raw_input(self.questions[self.index].question + " ")

        if userInputForQuestion not in self.questions[self.index].answers:
            print("Try again.")
            self.AskQuestion()


        self.questions[self.index].selectedAnswer = userInputForQuestion

        self.index += 1;

    def resetIndex(self):
        self.index = 0

    def ReadQuestions(self):
        pass

我通过调用AskQuestion几次来测试这段代码(循环遍历所有问题),并确保此代码是最顶层的,我提供了多个回答“再试一次”的答案。问题是,如果我提供了一个以上错误答案的问题,但如果我在多个错误答案后正确回答,我会收到以下错误消息:

IndexError: list index out of range

我立即怀疑[self.index]的{​​{1}},所以我开始将索引打印到控制台。我认为问题是AskQuestion在AskQuestion函数的最后一行神奇地增加了self.index,但没有。在第一个问题的情况下,它保持打印一致的数字0!

我在这里结束了我的智慧,而我在此看到的其他问题并没有起到太大作用。希望你们能帮忙,谢谢!

1 个答案:

答案 0 :(得分:1)

请注意在您的功能体中,当给出错误的答案时,该功能不会结束。它进行递归调用。当该呼叫结束时,索引仍然增加。所以错误的答案仍然使指数变得混乱。

您应该在拨打错误电话后结束该功能,以实现您想要发生的事情。

if userInputForQuestion not in self.questions[self.index].answers:
    print("Try again.")
    self.AskQuestion()
    return None

或使用else

if userInputForQuestion not in self.questions[self.index].answers:
    print("Try again.")
    self.AskQuestion()
else:
    self.questions[self.index].selectedAnswer = userInputForQuestion
    self.index += 1;

另请注意,以这种方式使用递归并不常见。无论如何,这让你犯了错误。