首页 > 解决方案 > Python 二进制递归搜索 5.2.6 Binary.py

问题描述

我正在尝试解决一个家庭作业,我设计了一个具有 2 个输入、一个日期列表和一个整数(一年)的函数。如果年份在日期列表中,该函数的目标是返回 True 或 False。我相信我已经开发了完成此任务的代码。但是,我收到的错误是它说我没有使用递归(要求之一)完成问题。如果我的解决方案看起来不正确,有人可以告诉我吗?我相信我目前的解决方案现在可以解决问题。非常感谢。彼得

#for two versions of binary_search: one using recursion, one
#using loops. For this problem, use the recursive one.
#
#In this problem, we want to implement a new version of
#binary_search, called binary_search_year. binary_search_year
#will take in two parameters: a list of instances of Date,
#and a year as an integer. It will return True if any date
#in the list occurred within that year, False if not.
#
#For example, imagine if listOfDates had three instances of
#date: one for January 1st 2016, one for January 1st 2017,
#and one for January 1st 2018. Then:
#
#  binary_search_year(listOfDates, 2016) -> True
#  binary_search_year(listOfDates, 2015) -> False
#
#You should not assume that the list is pre-sorted, but you
#should know that the sort() method works on lists of dates.
#
#Instances of the Date class have three attributes: year,
#month, and day. You can access them directly, you don't
#have to use getters (e.g. myDate.month will access the
#month of myDate).
#
#You may copy the code from Worked Example 5.2.5 and modify
#it instead of starting from scratch. You must implement
#binary_search_year recursively.
#
#Don't move this line:
from datetime import date


#Write your code here!
def binary_search_year(searchList, searchTerm):
    searchList.sort()
    if len(searchList) == 0:
        return False
    end = len(searchList)-1
    if searchList[end].year == searchTerm:
        return True
    else:
        return binary_search_year(searchList[:end], searchTerm)

    
#Below are some lines of code that will test your function.
#You can change the value of the variable(s) to test your
#function with different inputs.
#
#If your function works correctly, this will originally
#print: True, then False
listOfDates = [date(2016, 11, 26), date(2014, 11, 29), 
               date(2008, 11, 29), date(2000, 11, 25), 
               date(1999, 11, 27), date(1998, 11, 28), 
               date(1990, 12, 1), date(1989, 12, 2), 
               date(1985, 11, 30)]

print(binary_search_year(listOfDates, 2016))
print(binary_search_year(listOfDates, 2007))


标签: pythonrecursionsearchbinary

解决方案


这本身就是一个非常奇怪的任务,因为递归搜索像这个列表这样的线性数据类型是一个非常糟糕的主意,我不知道为什么要教你这样做。此外,如果你不使用它在逻辑中排序的事实,那么对它进行排序是没有意义的——断章取义,这似乎是一个非常糟糕的练习。

另外,你说你递归搜索是对的,只是由于上述原因它效率很低。因此,如果您的答案不正确,则很有可能您使用递归的方式不被认为是最佳的。

由于那里有先排序的建议,并且该函数被调用,binary_search_year也许这个想法是你对列表进行排序,看看中间的内容,然后决定如果中间值不是,则只搜索左半部分或右半部分你在追求什么。不过,任务不是很清楚。

我的猜测是,您以前曾被教过一些binary_search您没有在问题中分享的内容,这解释了我必须做出的上述假设。

像这样的工作:

def binary_search_year(search_list, search_term, list_sorted=False):
    if len(search_list) == 0:
        return False
    if not list_sorted:
        search_list.sort()
    middle = len(search_list) // 2
    if search_list[middle].year == search_term:
        return True
    elif search_list[middle].year < search_term:
        return binary_search_year(search_list[middle+1:], search_term, list_sorted=True)
    else:
        return binary_search_year(search_list[:middle], search_term, list_sorted=True)

请注意,此解决方案添加了优化,不会一次又一次地对列表进行排序,而是对它进行一次排序并告诉递归调用它已经被排序。


推荐阅读