递归功能具有相同的参数



我正在用Python创建一个基于文本的游戏,并撞到了路障。我的功能可以检查用户输入是否包含某些单词,并且如果它确实返回了用户输入,否则将重新掩盖输入。如果您编写不包含其中一个单词的东西,它将重新打电话。

def contains_words(prompt, words):
    user_input = raw_input(prompt).strip().lower()

    if user_input == "instructions":
        print
        instructions()
        print
        contains_words(prompt, words)
    elif user_input == "i" or user_input == "inventory":
        if len(inventory) == 0:
            print 
            print "There is nothing in your inventory."
            print
            contains_words(prompt, words)
        else:
            print "Your inventory contains: " + inventory
            contains_words(prompt, words)
    else:
        if user_input in words:
            return user_input
        else:
            print
            print "I did not understand your answer, consider rephrasing."
            contains_words(prompt , words) 

这是我称之为:

pizza = contains_words("Do you like pizza?", ["yes", "no"])

在此功能中,您可以提出指令或库存,然后回想起该功能。如果您第一次被问到回答中的一个单词之一,一切都像正常人一样工作。当您输入不正确的内容,提出库存或提出说明时,问题就会发生。它导致该功能什么都没有返回,而不是用户输入。为什么会发生这种情况?是因为函数重置以使参数等于无吗?

让我们浏览此功能的示例调用。

pizza = contains_words("Do you like pizza?", ["yes", "no"])

说用户输入instructions。您的第一个if语句是True,因此我们输入该块,instructions()被调用(可能是对控制台打印说明),然后再次调用contains_words。假设这次用户输入yes。我们将到最后一个if语句,它将是Truecontains_words的此呼叫将返回yes -将其称为

所以,现在我们将堆栈备份到contains_words的原始调用中。返回值将被忽略,因为该函数本身是在行上调用的,而不是作为另一个函数或语句的参数。现在,我们已经完成了此if块,而该功能的下一步是……什么都没有。其余的if s。 elif s和 else s没什么意思(正如原始的if评估为True),我们从功能的底部退出。它没有返回(实际上是None)。(检查查看的pizza的类型。)

解决方案是将您的递归调用更改为 return contains_words(prompt, words),因此当功能从每个递归调用中删除时,它会将返回值传递到堆栈上,或者,由于无论如何这只是尾部回复,请用循环替换:

def contains_words(prompt, words):
    while True:
        user_input = raw_input(prompt).strip().lower()

        if user_input == "instructions":
            print
            instructions()
            print

        elif user_input == "i" or user_input == "inventory":
            if len(inventory) == 0:
                print 
                print "There is nothing in your inventory."
                print
            else:
                print "Your inventory contains: " + inventory
        else:
            if user_input in words:
                return user_input
            else:
                print
                print "I did not understand your answer, consider rephrasing."

将避免可能与许多递归有关的记忆问题。

您只需要由return contains_words(prompt, words)

替换代码contains_words(prompt, words)中的语句

重复时,您需要返回结果。

return contains_words(prompt , words) 

相关内容

  • 没有找到相关文章