好吧所以我正在编写这个程序,用户会想到1到100之间的数字然后计算机(最多8次猜测)会在100%的时间内猜出这个数字(假设用户提供了正确的信息)。用户只是说过去猜测的计算机是否太高或太低,然后计算机将其下一个猜测调整为它所知道的。逻辑类似于此。
所以我想到的方法是你有一个变量x = 50如果它太高而你除以2而x变为25如果25太低那么你会乘以1.5
好的,问题是你究竟如何将它放入代码中。我只需要if语句没有完全写出来(循环)我不想写8次(我想我可以做)我可以做循环我只需要代码/数学的基础知识。
答复: 这不是家庭作业,它是一个我正在研究的项目(自学)。 这是Java。 对代码而言,这只是一部分。
答案 0 :(得分:1)
所以我想到的方法是你有一个变量x = 50如果它太高而你除以2而x变为25如果25太低那么你会乘以1.5
这对于初始迭代是可行的,因为如果50太低,乘以1.5将得到75.如果它太高,除以2将得到25.在这两种情况下,你移动到中点新的范围。
但是,假设您的号码是99.在第一个问题之后,您的新中点将是75,您将再次提出问题。由于75 仍然太低,你将它乘以1.5并最终得到大约112,这远远超出可能的值范围。
您需要做的是,而不是中点值的简单乘法,根据当前范围的大小计算新的中点。您可以使用delta值维护另一个变量(从当前中点添加或减去以获得新的中点),从25开始,每次迭代减半。
简单地说,这是二元搜索(或斩波)的应用。但是有一种更简单的方法,只使用高低边界(使用计算的中点)并根据用户的答案调整那些边界的一个。
在伪代码中,这类似于(略微修改以获得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
会给你{ {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代码。如果你想学习,我的建议是 - 自己实施。