擅长:python、mysql、java
<p>我认为这里有两个非常简单、优雅的解决方案。在</p>
<p>我们的想法是有一系列问题要问。只要问题仍然存在,这两种实现都会继续询问。一种方法是使用<code>itertools.dropwhile()</code>方法从列表中删除元素,只要问题的答案是正确的,另一种方法会做一些不同的事情——见下文。在</p>
<p>在这个示例实现中,神奇的答案“foo”是任何问题的错误答案。您可以在Python中运行它,以检查它是否会在您回答“foo”的问题上重新开始询问(剩余的)问题。在</p>
<p>通过修改<code>ask_question()</code>函数来适应您的情况应该很简单。在</p>
<pre><code>import itertools
input = lambda x: raw_input("what is your "+x+"? ")
# returns true or false; wether or not the question was answered
# correctly
def ask_question(question):
answer = input(question)
# could be any test involving answer
return answer != "foo"
# assume we have a list of questions to ask
questions = [ "age", "height", "dog's name" ]
# keep on looping until there are questions
while questions:
questions = list(itertools.dropwhile(ask_question, questions))
</code></pre>
<p><strong>编辑</strong>
因此,在幕后,仍然有两个while循环(<code>takewhile()</code>是一个赠品:-)。只要有一点开箱即用的思想,它甚至可以不需要一个while循环就可以完成:</p>
<p>递归就是这个词!在</p>
^{pr2}$
<p>如果您愿意,可以压缩为:</p>
<pre><code>def ask(q_list):
if qlist:
ask(q_list[1:]) if ask_question(q_list[0]) else ask(q_list)
</code></pre>