具有相同参数的递归函数
Recursive function with same arguments
我正在 python 中创建基于文本的游戏,但遇到了障碍。我有一个功能可以检查用户输入是否包含某些单词,如果包含,则 returns 用户输入,否则它将重新请求输入。如果您编写的内容不包含其中一个单词,它将重新调用该函数。
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"])
在此功能中,您可以调出说明或您的库存,然后它会调用该功能。如果您在第一次被询问时将其中一个词放入答案中,一切都会正常进行。当您输入不正确的内容、调出库存或调出说明时,就会出现问题。它导致函数 return 什么都没有,而不是用户输入。为什么会这样?是不是因为函数重置所以参数等于none?
您只需将代码 contains_words(prompt, words)
中的语句替换为 return contains_words(prompt, words)
递归时,需要return结果。
return contains_words(prompt , words)
让我们来看看这个函数的示例调用。
pizza = contains_words("Do you like pizza?", ["yes", "no"])
假设用户输入 instructions
。您的第一个 if
语句是 True
,因此我们进入该块,调用 instructions()
(大概是向控制台打印指令),然后再次调用 contains_words
。假设用户这次输入 yes
。我们将深入到最后一个 if
语句,它将是 True
,而 contains_words
的调用将 return yes
-- 到它被调用的地方。
所以,现在我们将堆栈备份到 contains_words
的原始调用。 return 值被忽略,因为该函数是单独在一行上调用的,而不是作为另一个函数或语句的参数。现在我们完成了这个 if
块,函数中的下一件事是……什么都没有。 if
的其余部分。 elif
s 和 else
s 没有任何意义(因为原始的 if
评估为 True
),我们从函数的底部退出。它 return 没什么(实际上 None
)。 (勾选pizza
的类型看看。)
解决方案是将递归调用更改为 return contains_words(prompt, words)
,这样当函数退出每个递归调用时,它会将 return 值传递到堆栈中,或者,因为这只是尾部-无论如何递归,用循环替换它:
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."
这将避免可能涉及许多递归的内存问题。
我正在 python 中创建基于文本的游戏,但遇到了障碍。我有一个功能可以检查用户输入是否包含某些单词,如果包含,则 returns 用户输入,否则它将重新请求输入。如果您编写的内容不包含其中一个单词,它将重新调用该函数。
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"])
在此功能中,您可以调出说明或您的库存,然后它会调用该功能。如果您在第一次被询问时将其中一个词放入答案中,一切都会正常进行。当您输入不正确的内容、调出库存或调出说明时,就会出现问题。它导致函数 return 什么都没有,而不是用户输入。为什么会这样?是不是因为函数重置所以参数等于none?
您只需将代码 contains_words(prompt, words)
中的语句替换为 return contains_words(prompt, words)
递归时,需要return结果。
return contains_words(prompt , words)
让我们来看看这个函数的示例调用。
pizza = contains_words("Do you like pizza?", ["yes", "no"])
假设用户输入 instructions
。您的第一个 if
语句是 True
,因此我们进入该块,调用 instructions()
(大概是向控制台打印指令),然后再次调用 contains_words
。假设用户这次输入 yes
。我们将深入到最后一个 if
语句,它将是 True
,而 contains_words
的调用将 return yes
-- 到它被调用的地方。
所以,现在我们将堆栈备份到 contains_words
的原始调用。 return 值被忽略,因为该函数是单独在一行上调用的,而不是作为另一个函数或语句的参数。现在我们完成了这个 if
块,函数中的下一件事是……什么都没有。 if
的其余部分。 elif
s 和 else
s 没有任何意义(因为原始的 if
评估为 True
),我们从函数的底部退出。它 return 没什么(实际上 None
)。 (勾选pizza
的类型看看。)
解决方案是将递归调用更改为 return contains_words(prompt, words)
,这样当函数退出每个递归调用时,它会将 return 值传递到堆栈中,或者,因为这只是尾部-无论如何递归,用循环替换它:
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."
这将避免可能涉及许多递归的内存问题。