Java 如何将此逻辑转化为代码/数学?
好的,我正在编写这个程序,让用户想到一个介于1和100之间的数字,然后计算机(最多8次猜测)会100%地猜测这个数字(假设用户提供了正确的信息。用户只需简单地说出计算机过去的猜测是过高还是过低,然后计算机将其下一次猜测调整为它所知道的。逻辑与此类似Java 如何将此逻辑转化为代码/数学?,java,optimization,mathematical-optimization,Java,Optimization,Mathematical Optimization,好的,我正在编写这个程序,让用户想到一个介于1和100之间的数字,然后计算机(最多8次猜测)会100%地猜测这个数字(假设用户提供了正确的信息。用户只需简单地说出计算机过去的猜测是过高还是过低,然后计算机将其下一次猜测调整为它所知道的。逻辑与此类似 第一:“它大于50吗?”不。所以它在1到50之间 第二个:“它大于25吗?”是的。所以它在26到50之间 第三:“它大于38吗?”不。所以它在26到38之间 第四:“它大于32吗?”不。所以它在26到32之间 第五:“它大于29吗?”不。所以它在2
- 第一:“它大于50吗?”不。所以它在1到50之间
- 第二个:“它大于25吗?”是的。所以它在26到50之间
- 第三:“它大于38吗?”不。所以它在26到38之间
- 第四:“它大于32吗?”不。所以它在26到32之间
- 第五:“它大于29吗?”不。所以它在26到29之间
- 第六:“它大于27吗?”是的。所以它不是28就是29
- 第七个:“是28号吗?”不是。所以是29号
- 第八条:“是29号吗?”是的
你需要做的不是简单地乘以中点值,而是根据当前范围的大小计算出新的中点。你可以用增量值(加上或减去当前中点得到新的中点)维护另一个变量,每次迭代从25开始,减半 简单地说,这是一个二进制搜索(或chop)的应用。但是有一个更简单的方法,只使用上限和下限(计算出一个中点),并根据用户的答案调整其中一个边界 在伪代码中,这类似于(稍微修改以获得
yes
、more
和less
的响应):
set low to 1 # starting range
set high to 100
set answer to 'more' # force entry to loop
until answer is 'yes':
if high is low: # only one possibility left
say 'Aaah, it must be ', high
exit
mid = (high + low) / 2 # choose midpoint and ask about it
say 'Is it ', mid
get answer
if answer is 'yes': # if match, claim victory and exit
say "I got it."
exit
if answer is 'more': # otherwise adjust range depending on answer
low = mid + 1 # - must be greater than mid
else:
high = mid - 1 # - must be less that mid
这是一个简单得多的解决方案,它还可以防止大多数初学者在进行第一次二进制搜索时发现的问题,即在最后陷入无限循环,因为(例如)(28+29)/2
再次为您提供28
,这意味着您可能永远不会检查元素编号29
。在上面的伪代码中,新范围不包括旧中点这一事实意味着这不会发生
作为附录,这里是Python(2.7,Python 5月3日需要使用<代码>输入< /代码>,而不是<代码> RWYPurvivs/COD>)代码来实现上述(类似于足以说明为什么我认为Python是最终的伪代码语言):
我不会在Java中提供同样的内容,因为(1)我怀疑这可能是课堂作业,(2)如果你自己做,不管你是否做课堂作业,你都会成为一名更好的开发人员。逻辑:二进制搜索。互联网上有很多关于这个主题的信息。 如果你读了它,你就会明白为什么在100的范围内8次猜测就足够了
Java代码实现:上面的链接中有伪代码,可以在互联网上使用Java代码。如果你想学习,我的建议是-自己实现。C#,Java,伪代码?…老实说,这看起来像是家庭作业。我们可以帮你做这件事-你学到了什么?你的逻辑是错误的。想想如果你有机会,你会怎么做d来完成计算机的工作。你真的只需要跟踪一个数字吗?这足以解决问题吗?如果你注意到,逻辑是计算机在每一步都知道猜测的数字在
x
和y
之间。因此,计算机询问z
介于x
和y之间的一个数字
。根据猜测的数字是大于还是小于z
,您可以将x
或y
设置为z
,然后以较小的范围重试。
import sys
low = 1
high = 100
answer = "more"
while answer != "yes":
if high == low:
print 'Aaah, it must be', high
sys.exit()
mid = (high + low) / 2
print 'Is it', mid
answer = raw_input()
if answer == "yes":
print "I got it."
sys.exit()
if answer == "more":
low = mid + 1
else:
high = mid - 1