如何将这个逻辑放入代码/数学?

时间:2013-12-03 02:27:11

标签: java optimization mathematical-optimization

好吧所以我正在编写这个程序,用户会想到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岁吗?” YES。

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

好的,问题是你究竟如何将它放入代码中。我只需要if语句没有完全写出来(循环)我不想写8次(我想我可以做)我可以做循环我只需要代码/数学的基础知识。

答复: 这不是家庭作业,它是一个我正在研究的项目(自学)。 这是Java。 对代码而言,这只是一部分。

2 个答案:

答案 0 :(得分:1)

  

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

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

但是,假设您的号码是99.在第一个问题之后,您的新中点将是75,您将再次提出问题。由于75 仍然太低,你将它乘以1.5并最终得到大约112,这远远超出可能的值范围。


您需要做的是,而不是中点值的简单乘法,根据当前范围的大小计算新的中点。您可以使用delta值维护另一个变量(从当前中点添加或减去以获得新的中点),从25开始,每次迭代减半。

简单地说,这是二元搜索(或斩波)的应用。但是有一种更简单的方法,只使用高低边界(使用计算的中点)并根据用户的答案调整那些边界的一个

在伪代码中,这类似于(略微修改以获得yesmoreless的回复:

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会给你{ {1}}再次,这意味着您可能永远不会检查元素编号28。在上面的伪代码中,新范围排除旧中点的事实意味着这不会发生。


作为附录,这里是Python(2.7,Python 3可能需要使用29而不是input)代码实现上述(类似于足以说明为什么我认为Python是最终的伪 - 代码语言):

raw_input

我不会在Java中提供相同的内容,因为(1)我怀疑这可能是课堂作业,(2)如果你自己做,不做作业,你会成为一个更好的开发者。

答案 1 :(得分:0)

逻辑:二进制搜索。互联网上有很多关于这个主题的信息。 http://en.wikipedia.org/wiki/Binary_search_algorithm 如果您阅读它,您将理解为什么8个猜测足以达到100的范围。

Java代码实现:上面的链接中有伪代码,Internet中有现成的Java代码。如果你想学习,我的建议是 - 自己实施。