具有相同参数的递归函数

时间:2015-05-17 17:33:05

标签: python user-input text-based

我在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"])

在此功能中,您可以调出说明或库存,然后它将调用该功能。如果您在第一次被问到答案时将其中一个单词放在答案中,那么一切都会正常工作。当您输入不正确的内容,调出库存或提出说明时,就会出现问题。它导致函数不返回任何内容,而不是用户输入。为什么会这样?是因为函数重置所以参数等于none?

3 个答案:

答案 0 :(得分:1)

您只需要通过contains_words(prompt, words)

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

答案 1 :(得分:1)

当你递归时,你需要返回结果。

return contains_words(prompt , words) 

答案 2 :(得分:1)

让我们来看看这个函数的示例调用。

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

说用户输入instructions。您的第一个if语句是True,因此我们输入该块,调用instructions()(可能是向控制台打印指令),然后再次调用contains_words。假设用户此次输入yes。我们将转到上一个if语句,它将是True,此contains_words的调用将返回yes - 到它所在的位置称为

所以,现在我们将堆栈备份到contains_words的原始调用。返回值被忽略,因为函数本身在一行上调用,而不是作为另一个函数或语句的参数。现在我们完成了这个if块,函数中的下一个东西是......什么都没有。 if的其余部分。 elifelse 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."

这将避免可能导致多次递归的内存问题。