我想让代码类似于无限猴子定理 该定理指出:
好吧,假设我们用蟒蛇取代一只猴子来生成一个莎士比亚的句子?并计算试验一只猴子在打字机键盘上随机敲击键无限 时间量几乎肯定会键入给定的文本,如 莎士比亚的全集。
例如:“将它视为狡猾的人”
这是我写的:
def Monkey_Theorem(sentence):
sentence.lower()
string_letters = 'abcdefghijklmnopqrstuvwxyz'
import random
a = []
l = ''
x = 0
trials = 0
while x < (len(sentence) - 1):
trials += 1
z = random.choice(string_letters)
if z == sentence[x]:
a.append(z)
x += 1
elif z == " ":
trials -= 1
a.append(" ")
if x > (len(sentence) - 1):
l = ''.join(l)
break
return l and trials
我把它写入python 2.7 IDLE,按回车然后写道:
Monkey_Theorem("methinks it is like a weasel")
之后我按下了输入..它移动到下一行并没有提出(&gt;&gt;&gt;)
过了一段时间没有结果,当我试图用绝望的方式关闭IDLE时,它表示程序仍在运行
这里的问题:
(A)是while循环无限的一个?
(B)或我的IDLE很慢?
(C)其他原因
以及如何解决原因
还有一个请求 如果我将来遇到这种情况,如何(A),(B),(C)?如何检测案件?
答案 0 :(得分:1)
在您的代码中,您设置了string_letters = 'abcdefghijklmnopqrstuvwxyz'
。请注意string_letters
中没有空格,因此当您匹配整个第一个单词'methinks'
时,就无法匹配该单词之后的空格。所以你的循环会无限延续。
您可以通过在string_letters
的定义字符串末尾添加空格来解决该特定问题。但正如其他人指出的那样,你的代码也存在其他问题。
至于检测它是什么,包括通过按键或按ctrl + C或类似的东西来停止循环的方法。然后打印trials
的值,看看它是否是非常大号。如果是这样,您将拥有无限或极长的循环。
答案 1 :(得分:1)
你可以在循环中打印一些内容以查看它是否是无限的...例如,如果z
永远不等于sentence[x]
,那么你就不会增加它,并且循环从不停止。
当您需要猜测空格字符时会发生这种情况,因为您没有将其放入字符串中。因此,永远不会输入elif z == " ":
。
以下是您的代码的工作版本。
需要注意的一些事项:跟踪a
或l
毫无意义。在函数结束时,您将返回与sentence
完全相同的输入。此外,还有一个简单的导入来获取所有的英文字母。
from string import ascii_lowercase as alpha
import random
# add space character to possible choices
alpha += ' '
def Monkey_Theorem(sentence):
sentence = sentence.lower()
x = 0
trials = 0
while x < len(sentence):
trials += 1
z = random.choice(alpha)
if z == sentence[x]:
if z == " ": # this isn't really necessary
trials -= 1
print "guessed %s at trial %d" % (z, trials)
x += 1
return trials
trials = Monkey_Theorem("hello world")
print "number of trials = ", trials
输出
guessed h at trial 49
guessed e at trial 52
guessed l at trial 58
guessed l at trial 107
guessed o at trial 145
guessed at trial 157
guessed w at trial 168
guessed o at trial 197
guessed r at trial 232
guessed l at trial 248
guessed d at trial 269
number of trials = 269