2017-10-28 1 views
0

유명한 게임 "Tower of Hanoi"에 대한 연습을하고 있는데 코드를 실행할 때 오류가 있습니다. 그러나 나는 그것을 고치는 법을 모른다. 나는 그것이 IndexError 인상 실행할 때, 그래서하노이 타워 (클래스 포함) 인덱스가 범위를 벗어났습니다.

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) 

: 여기 내 코드의 범위를 벗어난리스트 인덱스입니다 라인 (17)에, "만약 new_disk < = self.content [0] :"를 add_method

에서

값이 목록에 없거나 범위를 벗어난 경우 Indexerror를 발생시킬 수 있지만 내 경우에 어떤 문제인지는 알 수 없습니다. 당신의 도움이

+0

죄송합니다. 목록의 정수는 타워의 디스크와이 게임의 규칙을 나타냅니다. "더 작은 디스크는 위에 놓지 않아도됩니다. 디스크." – Tom92

+0

내용을 인쇄 해보십시오. –

답변

0

h에 대한

덕분에 콘텐츠없이 작성됩니다

h = HanoiT() 

어떤 내용이 (__init__ 참조) 빈리스트가 될 것을 의미합니다.

및 라인 나중에, 당신은 그것을 전화 : 당신이 content 이후 self.content[0] 해당 당겨하려고 곳이 비어있는 라인에 도달 할 때까지

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

가 반복적으로 클래스 함수를 호출합니다 -이 그런 색인에 액세스 할 수 없습니다. content

+0

아, 이제 오류가 발생했습니다. 그러나 문제를 해결하는 방법이 보이지 않습니다. 재귀 함수 대신 반복 함수를 작성해야합니까? – Tom92

+0

재귀 함수를 작성하는 것이 더 쉬울 것입니다. 나는 완전한 구현을 포함하는 대답을 줄 수는 있지만, 많은 것을 배울 수는 없다. 배우기 위해서는 도면 보드로 돌아가서 현재 디자인에서 무엇이 잘못되었으며 어떻게 변경해야하는지 알아 내려고 노력해야합니다. – alfasin

+0

나는 movetower에 대한 반복적 인 해결책을 썼지 만 여전히 색인 오류를 발생 시키며 위키피디아에서 반복적 인 솔루션의 알고리즘을 발견하고이를 수행했습니다. def movetower (self, N, Tour1, Tour2, Tour3) : move ** 2 = N-1에 대한 제가 (이동 + 1) 범위 : 만약 % 3 == 1 self.movedisk (Tour1, Tour3) 만약 % 3 == 2 : 자기 . 이동 된 디스크 (Tour1, Tour2) if i % 3 == 0 : self.movedisk (Tour3, Tour2) – Tom92

관련 문제