Python 二进制递归搜索 5.2.6 Binary.py

Posted

技术标签:

【中文标题】Python 二进制递归搜索 5.2.6 Binary.py【英文标题】:Python Binary Recursive Search 5.2.6 Binary.py 【发布时间】:2021-03-30 20:44:07 【问题描述】:

我正在尝试解决一个家庭作业,我设计了一个具有 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))


【问题讨论】:

【参考方案1】:

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

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

既然有先排序的建议,并且该函数被称为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)

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

【讨论】:

以上是关于Python 二进制递归搜索 5.2.6 Binary.py的主要内容,如果未能解决你的问题,请参考以下文章

将递归函数分配给python中的变量

如何使用递归创建二进制搜索

字符串数组中字符串(多个实例)的递归二进制搜索 - C#

理解神秘工作的递归二进制搜索算法[重复]

递归除法和 impera 二进制搜索中的错误

c_cpp 递归二进制搜索树