2017-10-28 44 views
0

我正在做着名的游戏“河内塔”的练习,当我运行我的代码时出现错误。但我不知道如何解决它。这里是我的代码:河内塔(带类)索引超出范围

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,但我不知道我的情况是什么问题。没有内容创建

感谢您的帮助

+0

对不起,我忘了说列表中的整数代表塔上的磁盘,并且相对于这个游戏的规则:“没有磁盘可能放置在较小的顶部磁盘“。 – Tom92

+0

尝试打印内容 –

回答

0

h

这意味着它的内容将是一个空列表(见__init__)。

和线后,当你把它叫做:

h.movetower(N, Tour1, Tour2, Tour3) 

它会递归调用类的功能,直到它到达线,你尽量拉只self.content[0]因为content是空的 - 有没有这样的索引可用于访问content

+0

噢,是的,现在我明白了这个错误,但我不明白如何解决它,我必须编写一个迭代函数而不是递归函数? – Tom92

+0

写一个递归函数会更容易,是的。我可以给你一个答案,包括完整的实现,但你不会从中学到很多(进一步说,你可以谷歌它....)。为了学习,你必须回到绘图板,并试图找出当前设计中的错误,以及如何改变它。 – alfasin

+0

我写了移动塔的迭代解决方案,但它仍然提高索引错误,我发现在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