class BinaryStringList():
def __init_(self):
self.item = []
def strAdd(self,item):
self.items.append(item)
def finditem(self, item):
if len(self)==0:
print("List is empty!")
else:
midpoint = len(self)//2
if self[midpoint]==item:
print("Item Found ", item)
else:
if item<self[midpoint]:
return finditem(self[:midpoint], item)
else:
return finditem(self[midpoint+1:], item)
所以我发现我遇到的问题是在尝试将项目添加到列表中时。如果我这样做:
alist = BinaryStringList()
alist.strAdd("test1")
我的代码失败,说明对象没有属性。不知道为什么它失败了,因为我有几乎完全相同的代码用于另一个程序,除了find使用顺序搜索,因为这是一个二进制搜索。
答案 0 :(得分:0)
您的代码失败了,因为您拼错了__init__
。每侧需要两个下划线,或者它只是一个奇怪的命名方法。由于您缺少__init__
,因此使用默认__init__
(不设置属性),并且您没有item
或items
属性。您需要修复__init__
,并为items
使用一致的名称:
class BinaryStringList():
def __init__(self): # <-- Added extra trailing underscore
self.items = [] # Fixed name to be items, not item
你在这里遇到很多其他问题(你没有维护排序顺序,所以二进制搜索无法正常工作,你还没有实现__getitem__
所以self[midpoint]
赢了&# 39;工作所以你需要self.items[midpoint]
,缺少__len__
意味着len(self)
也不会工作,等等,但是上面的两个问题是具体的让你得到AttributeError
。
答案 1 :(得分:0)
您的代码中存在多个语法错误。此外递归不起作用,您需要具有返回的基本条件。这个解决方案可行,但我强烈建议您使用递归来解决更简单的问题,以了解它是如何工作的。
class BinaryStringList:
def __init__(self): # You had 1 _ after init
self.items = [] # Typo, should have been items.
def strAdd(self,item):
self.items.append(item)
def finditem(self, item):
return self.binser(self.items, item)
def binser(self, items, item):
if len(items)==0:
return
midpoint = len(items)/2 # len(self) means nothing, it should be len(self.items)
if items[midpoint]==item:
return item
else:
if item<items[midpoint]:
return self.binser(items[:midpoint], item) #self[:midpoint] means nothing, you needed self.items[:midpoint]
else:
return self.binser(items[midpoint+1:], item)
binser = BinaryStringList()
binser.strAdd(1) # You added a string here. Your logic won't work with string.
binser.strAdd(2)
binser.strAdd(3)
binser.strAdd(5)
binser.strAdd(8)
binser.strAdd(9)
binser.strAdd(10)
print binser.finditem(1)
print binser.finditem(10)
print binser.finditem(5)
print binser.finditem(11)
(还有其他解决二进制搜索的方法 - 即迭代方法,传递低/高索引值而不是拼接输入数组)。尝试使用这两种方法解决二进制搜索。
通过传递低/高索引值的二进制搜索,您的binser签名将如下所示:def binser(self, low, high, item):