Рекурсивный вызов, вызывающий IndexError в функции Class - PullRequest
0 голосов
/ 13 мая 2018

Цель моей программы - заставить компьютер задавать вопросы пользователю и возвращать некоторые спецификации для компьютера, которые соответствуют его потребностям. Сейчас я работаю над QuestionAsker, который отвечает, как подсказывает название класса, на вопросы пользователей. Я завис на 4-й строке функции 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] в self.questions[self.index], поэтому начал распечатывать указатель на консоль. Я думал, что проблема была в том, что AskQuestion волшебным образом увеличивал self.index в последней строке функции AskQuestion, но нет. Он продолжал печатать постоянное число, в случае первого вопроса, 0!

Я здесь, на мой взгляд, и другие вопросы, которые я видел по этому поводу, не очень помогли. Надеюсь, вы, ребята, можете помочь, спасибо!

1 Ответ

0 голосов
/ 13 мая 2018

Пожалуйста, позаботьтесь о том, чтобы в вашем теле функции, когда дается неправильный ответ, функция не заканчивалась. Это делает рекурсивный вызов. Когда этот вызов заканчивается, индекс все еще увеличивается. Таким образом, неправильные ответы все еще портят индекс.

Вы должны завершить функцию после того, как был сделан неправильный вызов, для чего вы хотите, чтобы.

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;

Также обратите внимание, что использование рекурсии таким способом не очень распространено. Что заставило вас сделать ошибку в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...