河内塔(带类)索引超出范围
我正在做着名的游戏“河内塔”的练习,当我运行我的代码时出现错误。但我不知道如何解决它。这里是我的代码:河内塔(带类)索引超出范围
class HanoiT():
def __init__(self, content=None):
if content is None:
self.content=[]
else:
self.content=content
def addmethod(self, new_disk): #Add an element on the beginning of the list
if new_disk <= self.content[0]:
self.content.insert(0, new_disk)
else:
raise ValueError("No disk may be placed on top of a smaller disk")
def deletemethod(self): #Delete the first element of a list
self.content.pop(0)
def affichage(self): #Method to print the list which represent the "disk" putted on the tower from the top to bottom
for i in self.content:
print(i, end=" ")
def movedisk(self, Tsource, Ttarget):
Ttarget.addmethod(Tsource.content[0])
Tsource.deletemethod()
def movetower(self, N, Tour1, Tour3, Tour2):
if N >= 1:
self.movetower(N-1, Tour1, Tour2, Tour3)
self.movedisk(Tour1, Tour3)
self.movetower(N-1, Tour2, Tour3, Tour1)
N = 4
Tour1 = HanoiT([x for x in range(1, N+1)])
Tour1.affichage()
Tour2 = HanoiT([])
Tour3 = HanoiT([])
h = HanoiT()
h.movetower(N, Tour1, Tour2, Tour3)
所以,当我运行它引发IndexError:列表索引超出范围,在第17行,这就是 “如果new_disk < = self.content [0]:” 在add_method
我看到,如果值不在列表中或超出范围,可以引发Indexerror,但我不知道我的情况是什么问题。没有内容创建
感谢您的帮助
h
:
这意味着它的内容将是一个空列表(见__init__
)。
和线后,当你把它叫做:
h.movetower(N, Tour1, Tour2, Tour3)
它会递归调用类的功能,直到它到达线,你尽量拉只self.content[0]
因为content
是空的 - 有没有这样的索引可用于访问content
噢,是的,现在我明白了这个错误,但我不明白如何解决它,我必须编写一个迭代函数而不是递归函数? – Tom92
写一个递归函数会更容易,是的。我可以给你一个答案,包括完整的实现,但你不会从中学到很多(进一步说,你可以谷歌它....)。为了学习,你必须回到绘图板,并试图找出当前设计中的错误,以及如何改变它。 – alfasin
我写了移动塔的迭代解决方案,但它仍然提高索引错误,我发现在wikipédia迭代解决方案的算法,我做到了这一点: def movetower(self,N,Tour1,Tour2,Tour3): moves (1,移动+ 1): 如果i%3 == 1: self.movedisk(Tour1,Tour3) if i%3 == 2: self。= 2 ** N-1 movingisk(Tour1,Tour2) if i%3 == 0: self.movedisk(Tour3,Tour2) – Tom92
对不起,我忘了说列表中的整数代表塔上的磁盘,并且相对于这个游戏的规则:“没有磁盘可能放置在较小的顶部磁盘“。 – Tom92
尝试打印内容 –