1

让计算机猜测一个用户在不超过 10 次的情况下在 1 到 1000 之间选择的数字。此分配使用一种称为二分搜索的算法。每次猜测后,该算法将搜索的可能答案数量减半。完整程序的伪代码如下;你的任务是把它变成一个工作的python程序。该程序应该首先在屏幕上打印指令,说明用户应该选择一个介于 1 到 1000 之间的数字,计算机将在不超过 10 次尝试中猜出它。然后它开始猜测,并在每次猜测后询问用户反馈。如果猜测需要更低,则应指示用户输入 -1,如果正确则输入 0,如果需要更高则输入 1。当程序猜测正确时,它应该报告需要猜测的次数。

伪代码

- Print instructions to the user  
-Start with high = 1000, low = 1, and tries = 1 
- While high is greater than low   
  - Guess the average of high and low  
  - Ask the user to respond to the guess  
  - Handle the four possible outcomes:  
    - If the guess was right, print a message that tries guesses were required and quit the program
    - If the guess was too high, set high to one less than the guess that was displayed to the user and increment tries  
    - If the guess was too low, set low to one more than the guess that was displayed to the user and increment tries
    - If the user entered an incorrect value, print out the instructions again
- high and low must be equal, so print out the answer and the value of tries

我需要一些认真的帮助!我根本不明白这些东西!这就是我所拥有的

def main(x, nums, low, high):
        input("Enter -1 if the guess needs to be lower, 0 if the guess was right, or 1 if the guess needs to be higher: ")
    for i in range (1, 1001):

main()

我什至不知道它是否正确!

4

7 回答 7

14

在考虑如何在 python(或任何语言)中实现它之前,让我们看一下伪代码,这看起来是解决问题的一个很好的计划。

我猜你可能会遇到的一件事是伪代码引用变量的方式,比如highlow。理解变量的方法是将它们视为可以存储值的槽。在任何给定时间,变量都有一些值,例如数字 5,或对打开文件的引用。该值可以随时通过使用其名称来调用,也可以通过分配给它来赋予新值,并且旧值将被新值取代而被遗忘。

伪代码引用了三个变量high,lowtries。它还告诉您它们的初始值应该是什么。在第二行执行后,这些值分别设置为 1000、1 和 1,但随着程序的进行,它们会采用新的值。

伪代码的另一个特点是条件循环和用户输入的案例分析。您对伪代码循环的翻译不正确。在您的情况下,您创建了一个新变量,i并指示您的程序运行循环体,其中 i 的每个值都在 1 到 1000 之间。显然这与伪代码没有太大关系。

相反,您想要做的是永远循环,直到某些条件(在循环体中发生变化)变为错误。在 python 中,该while语句执行此操作。如果你熟悉一个if语句,while看起来是一样的,但是在主体完成后,条件被重新评估,如果它仍然为真,则再次执行主体。

最后,循环体中的案例分析需要将某些内容与预期值进行比较。尽管其他一些语言有多种表达方式,但在 python 中,我们只有-if子句。 elifelse


除了将伪代码转换为工作代码之外,了解程序实际在做什么可能很有用。这里的关键在第 4 行,程序猜测两个值的平均值。之后,程序会根据猜测的结果进行操作。

在循环的第一次运行中,high包含 1000 和low包含 1,平均值为 500(实际上平均值为 500.5,但由于我们对整数求平均值,python 猜测我们希望除法的结果也是整数)。显然,这个猜测只有 0.1% 的可能性是正确的,但如果它是错误的,用户应该告诉我们它是太高还是太低。不管怎样,这个答案完全消除了 50% 的可能猜测。

例如,如果用户想的是一个较低的数字,那么当程序猜到 500 时,用户会告诉程序 500 太高,然后程序就不必猜测该数字在范围从 501 到 1000。这可以为计算机节省大量工作。

为了使用该信息,程序会跟踪目标编号可能的值的范围。当猜测的数字太高时,程序将其上限向下调整,刚好低于猜测值,如果猜测值太低,程序将其下界向上调整到刚好高于猜测值。

当程序再次猜测时,猜测正好在可能范围的中间,再次将范围减半。可能的猜测次数从最初的 1000 到一次猜测中的 500 次,到两次猜测中的 250 次。如果程序运气不好,不能得到两个(实际上很有可能),那么到第三个,它就只剩下 125 个数字需要担心了。在第四次猜测之后,范围内只剩下 62 个数字。这样继续下去,在八次猜测之后,只剩下 3 个数字,程序在第九次猜测中尝试中间的数字。如果结果是错误的,只剩下一个数字,程序就会猜到!

这种将范围分成两半然后继续到更近的一半的技术称为二分法,出现在计算机科学感兴趣的广泛主题中。


一些代码怎么样!由于我不想剥夺您的学习经验,因此我只会给您一些可能对您有所帮助的片段。python 是一种为交互式探索而设计的语言,因此请启动您的解释器并试一试。我将发布带有显示提示的示例,实际上不要输入。

while这是使用该子句的示例:

>>> x = 1000
>>> while x > 1:
...     x = x/2
...     print x
...
500
250
125
62
31
15
7
3
1
>>> x
1

从用户那里获取控制台输入应该通过这个raw_input()函数来完成。它只返回用户输入的任何内容。这有点难以展示。为简化起见,在需要输入的每一行 python 之后,我将输入“Hello World!” (不带引号)

>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>> 

一些概念的组合怎么样!

>>> myvar = ''
>>> while myvar != 'exit':
...     myvar = raw_input()
...     if myvar == 'apples':
...         print "I like apples"
...     elif myvar == 'bananas':
...         print "I don't like bananas"
...     else:
...         print "I've never eaten", myvar
...
apples
I like apples
mangoes
I've never eaten mangoes
bananas
I don't like bananas
exit
I've never eaten exit
>>> 

哎呀。那里有点小错误。看看能不能解决!

于 2009-06-14T04:17:12.610 回答
11

我根本不明白这些东西!

这是相当有问题的,但是,好吧,让我们一步一步来!你的家庭作业开始:

向用户打印说明

所以你不理解任何东西,你说,这意味着你也不理解这部分。好吧:“用户”是运行您的程序的人。“说明”是告诉他或她如何玩游戏的英语句子,根据这个非常清晰和详细的作业的以下引用:

该程序应该首先在屏幕上打印指令,说明用户应该选择一个介于 1 到 1000 之间的数字,计算机将在不超过 10 次尝试中猜出它。

print”是发出信息的Python指令;例如,尝试一个程序只包含

print "some information"

看看它是如何工作的。好的,您能否编辑您的答案以向我们表明您已了解这一点,以便我们可以转到下一个?如果我使用的任何单词或概念对您来说仍然太高级,请随时在此处发表评论并提出更多问题,我会尽力澄清!

于 2009-06-14T03:43:10.323 回答
4

您显然对编程很陌生,我想这是社区延迟响应的原因之一。很难决定从哪里开始以及如何指导您完成整个练习。

因此,在您在这里得到一个好的答案之前,包括让您了解那里发生的事情,并指导您自己构建解决方案(理想情况下!)我建议您访问此页面以尝试了解实际问题本身。

http://www.openbookproject.net/pybiblio/gasp/course/4-highlow.html

同时,请查看此主题中的所有答案并继续编辑您的帖子,以便我们知道您正在了解它。

于 2009-06-14T03:37:02.880 回答
2

与伪代码不完全匹配,但它有效。哈哈 ;)

我知道这是一个邪恶的旧帖子,但这也是我得到的相同任务。这是我最终得到的结果:

high = 1000
low = 1
print "Pick a number between 1 and 1000."
print "I will guess your number in 10 tries or less."
print "Or at least i'll try to.  ;)"
print "My first guess is 500."
guess = 500
tries = 0
answer = 1
print "Enter 1 if it's higher."
print "Enter -1 if it's lower."
print "Enter 0 if I guessed it!"
print ""
while (answer != 0):
    answer = int(raw_input("Am I close?"))
    if answer == 1:
        tries = tries + 1
        low = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == -1:
        tries = tries + 1
        high = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == 0:
        tries = tries + 1
        print "Your number is:"
        print guess
        print "Yay! I got it! Number of guesses:"
        print tries
于 2010-09-25T19:02:28.403 回答
1

欢迎来到堆栈溢出!

这里的诀窍是要意识到你的 Python 程序应该看起来几乎像伪代码。

首先让我们试着准确地理解伪代码在做什么。如果我们必须与伪代码描述的程序进行交互,它看起来像这样:

Think of a number between 1 and 1000 and press Enter.
>>> 
Is it 500? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> 1
Is it 750? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> -1
Is it 625? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.

等等

当我们第一次想到我们的数字时,程序只知道它在 1 到 1000 之间。它通过将变量 'low' 设置为 1 并将变量 'high' 设置为 1000 来表示这种知识。它的第一个猜测是这些的平均值数字,即 500。

在我们告诉程序我们的数字大于 500 后,它会将“low”的值更新为 501。换句话说,程序知道我们的数字在 501 和 1000 之间。然后它会猜测 501 和 1000 的平均值,即 750。我们告诉它我们的数字较低,因此程序将“high”的值更新为 749,然后猜测 501 和 749 的平均值,依此类推,直到它猜对,或者它缩小了可能的范围减少到一个数字(意味着它的下一个猜测将是正确的)。

所以回到用 Python 编写程序:我们基本上只是逐行翻译伪代码。例如,我们的程序循环应该看起来就像它在伪代码中的样子:

while high > low:
  # Guess (high + low) / 2 and ask user to respond
  # Handle user response

不需要像您在代码中那样使用 for 循环。

要获取输入,我们可以执行以下操作:

guess = (high + low) / 2
response = input('Is it ' + str(guess) + '? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.')

现在用户输入存储在变量'response'中,我们可以使用if语句来处理可能性,例如'if response == -1:'。

只需记住在进入 while 循环之前打印说明并将“高”和“低”设置为初始值,您就应该准备就绪。

祝你好运!

于 2009-06-14T05:59:19.027 回答
1

好的,使用 Python 的好处在于它几乎是伪代码。

现在,让我们考虑各个步骤:

  1. 您如何获得高低之间的平均值?

  2. 您如何询问用户回答者是否正确

  3. Python 中的“if”语句是什么样的,你如何将伪代码写成 if 语句?

这是另一个提示——您可以将 python 作为解释器运行并尝试单独的语句,例如,您可以这样做

high=23
low=7

然后计算你认为应该是它们之间的平均值或中点(提示:15)

于 2009-06-14T03:42:48.217 回答
0

这里有一些提示可以帮助您入门:

平均值 = 值 + 值 + 值 [...] / 值的数量;(例如,((2 + 5 + 3)/(3))

许多编程语言使用不同的运算符优先级。当我编程时,当我不确定运算符优先级时,我总是使用括号。在我上面的例子中,如果你只做了 2 + 5 + 3 / 3,程序会在加法之前进行除法运算 - 所以它会计算为 2 + 5 + (3 / 3),或 2 + 5 + 1 == 7 .

为 python 用户跳过这个 /* 其次:您最早的程序可以从 const 正确性中受益(这里很好地解释了它是什么以及为什么它是非常好的实践)。请通读并理解为什么你应该使用常量(或任何 python 等价物)。还要查找“幻数”,这是一个使用常量的大领域。*/

谷歌“请原谅我亲爱的莎莉阿姨”(注意:这仅涉及数学运算符,并且大多数情况下适用于编程语言;要更全面地研究运算符优先级,请查看您选择的语言的文档以了解优先级 - 另请注意,大多数程序没有内置的幂运算符,但大多数标准库都有 pow 函数)。

说到标准库:熟悉标准库函数(我没用过 Python,不知道它是如何实现 SL 的,但是如果一种流行的语言没有开发良好的 SL,我会感到非常惊讶)。如果你不知道那是什么,而你的书/教程没有,那就买一本新的。任何不引用标准库的资源都不值得花时间。

最后:虽然这篇文章看起来我知道我在说什么,但我真的仍处于学习的早期阶段,就像你一样。一些你可能想早点习惯的事情(当我跳过这些部分时,它大大减慢了我的学习速度):引用和指针的使用(Q 评论:Python 有指针吗?),数据之间的差异IN 一个内存位置和实际内存位置(通常情况下,值在内存中的位置比值本身更有用,至少在编写数据结构时)。尤其习惯标准库;查找在字符串操作中有用的复制、查找等类型函数。

实际上,重读您的原始帖子,我没有意识到这是一个家庭作业类型的作业。如果你这样做不是为了好玩,你可能永远不会接受我的建议。请记住,如果您不把它变成一件苦差事,并且当您的代码无法编译(或...解释),或者您得到意想不到的结果等时,请记住编程可以非常有趣。

于 2009-06-14T04:24:41.923 回答