我的任务是编写一个程序来猜测一个用户正在考虑的日期,AI要求10或更少,'是'或'否'的问题。基本上这只是一个反向猜数游戏。我写了一个函数,创建了一年中所有日期的列表,从1月1日到12月31日,基本上是365个条目。
def Calendar(monthNames, numDaysInMonth):
'''Return a list of elements, each element
is a date in a calendar year'''
if len(monthNames) != len(numDaysInMonth):
return []
dates = []
idx = 0
while idx < len(monthNames):
for date in range(1, numDaysInMonth[idx] + 1):
dates.append(monthNames[idx] + " " + str(date))
idx = idx + 1
return dates
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
numDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
print(Calendar(months, numDays))
显然不需要print语句,但用于检查我的工作。现在,我的问题是,我从哪里开始?由于计算机询问“是”或“否”问题,我希望程序通过将数字除以一半直到“日期”归零为止来缩小范围,然后使用该数字指向我已经创建的功能。我决不是要求为我做这件事,但在正确的方向上一个好的推动会很好。我迷失在下一步该做什么。
答案 0 :(得分:0)
我可以将它视为二叉树实现..总计是365天根据用户输入是或否除以2
365/2 - step 1 yes or no
182 -2
91 . -3
45 -4
22 -5
11 -6
5 -7
2 -8
1,2 . - 9, 10
粗略估计,但我想优化算法会有所帮助
答案 1 :(得分:0)
您似乎被要求编写一个应用某种{{3}}的程序。
因为要求您的计算机回答一个Y / N问题,所以让我们定义一个会询问问题的函数,接收答案并返回一个相应的布尔值:
def is_earlier(guess):
answer = input("is {} earlier then your date? Y - earlier /N - not earlier".format(guess))
if answer.upper() == "Y":
return True
else:
return False
所以基本上,这段代码每次都会询问用户是否属于早期属性,并会根据用户的反应做出反应。
接下来,让我们使用二进制搜索:每个程序都会询问用户d,它指向的当前日期是否更早。 如果d更早,我们将扔掉#34;列表中的所有内容,然后是d-1(前一天)。 如果d是晚些时候或者确切日期,我们将&#34;扔掉&#34;那些早于d的一切。 当我们只剩下一个值的lst时 - 我们返回这个值 - 这是我们的日期。
def guess_game(lst = Calendar(months,numDays)):
if len(lst) == 1:
return lst[0]
mid = len(lst)//2
if is_earlier(lst[mid]):
return guess_game(lst[:mid])
else:
return guess_game(lst[mid:])
现在为什么不到10个问题呢?如果我们知道二进制搜索采用粗略的LOG(N)操作(其中N是列表的长度),并且我们知道一年365天就有这种情况,我们将达到8-10个问题,具体取决于用户在列表中选择的日期的位置。