Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将此逻辑转化为代码/数学?_Java_Optimization_Mathematical Optimization - Fatal编程技术网

Java 如何将此逻辑转化为代码/数学?

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

好的,我正在编写这个程序,让用户想到一个介于1和100之间的数字,然后计算机(最多8次猜测)会100%地猜测这个数字(假设用户提供了正确的信息。用户只需简单地说出计算机过去的猜测是过高还是过低,然后计算机将其下一次猜测调整为它所知道的。逻辑与此类似

  • 第一:“它大于50吗?”不。所以它在1到50之间
  • 第二个:“它大于25吗?”是的。所以它在26到50之间
  • 第三:“它大于38吗?”不。所以它在26到38之间
  • 第四:“它大于32吗?”不。所以它在26到32之间
  • 第五:“它大于29吗?”不。所以它在26到29之间
  • 第六:“它大于27吗?”是的。所以它不是28就是29
  • 第七个:“是28号吗?”不是。所以是29号
  • 第八条:“是29号吗?”是的
所以我的想法是,你有一个变量x=50,如果它太高,那么你除以2,x变为25,如果25太低,那么你将乘以1.5

好的,那么问题是你到底是如何将其转化为代码的。我只需要if语句没有完全写出(循环),我不想写8次(我想我可以做到),我可以做循环,我只需要代码/数学的基础知识

答复: 这不是家庭作业,这是我正在做的项目(自学)。 这是用Java编写的。 还有更多的代码,这只是一部分

所以我的想法是,你有一个变量x=50,如果它太高,那么你除以2,x变为25,如果25太低,那么你将乘以1.5

这对于初始迭代来说是可行的,因为如果50太低,乘以1.5会得到75。如果太高,除以2会得到25。在这两种情况下,你都会移动到新范围的中点

但是,假设你的数字是99。在第一个问题之后,你的新中点将是75,你将再次问这个问题。因为75仍然太低,你将它乘以1.5,最后得到大约112,这远远超出了可能的值范围


你需要做的不是简单地乘以中点值,而是根据当前范围的大小计算出新的中点。你可以用增量值(加上或减去当前中点得到新的中点)维护另一个变量,每次迭代从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