2014-03-14 1 views
0
def hanoi(n,src,dsc,aux): 
    if n == 1: 
     print_move(src,dsc) 
    else: 
     hanoi(n-1,src,aux,dsc) 
     print_move(src,dsc) 
     hanoi(n-1,aux,dsc,src) 

def print_move(src,dsc): 
    print("Move the top disk from",src,"to",dsc) 

I가 순차적으로 실행될 때, 상기 보조 전극을 통해 목적지 극 소스 극 모든 디스크를 이동하는 것이 움직임 출력 튜플 하노이 코드의 상기 탑을 변경하고자 . 디스크 이동은 소스 폴과 대상 폴의 두 숫자로 정의됩니다. 예를 들어, (1, 3)은 디스크를 첫 번째 폴에서 세 번째 폴로 이동하는 것을 나타냅니다. 따라서, hanoi(2,1,3,2) 출력됩니다 ((1,2),(1,3),(2,3))타워 - 움직임의 튜플

내 접근 방식은 tup, 빈 튜플이라는 글로벌 변수를 만드는 것입니다. 새로운 튜플 이동이 생성 될 때마다 tup에 추가됩니다. 내 문제는 언제 tup의 값을 반환해야하는지 모르겠다. hanoi 함수 내부에 return 행을 넣을 수있는 함수가 어디에 있는지.

+0

당신은 튜플에 물건을 추가 할 수 있지만, 대신에리스트를 반환 할 수 있고, 원한다면'tuple (result)'를 사용하여 그것을 튜플로 변환 할 수 있습니다.하지만 원하는 것은 목록 일 것입니다. – justhalf

답변

1

재귀 함수에서이를 달성하는 가장 좋은 방법은 일반적으로 같은 것입니다 : (. 변경 가능한 기본 매개 변수를 사용하여 문제를 방지하기 위해 None의 사용을 참고)

def hanoi(..., out=None): 
    if out is None: 
     out = [] # list to store output 
    ... 
    print_move(src, dsc) 
    out.append((src, dsc)) # add result to output 
    ... 
    hanoi(..., out) # call recursively and ignore return 
    ... 
    return out # return output 

그리고 전화 :

results = hanoi(...) 

이렇게하면 단일 목록 out이 모든 수준의 재귀 호출에 의해 공유되고 추가됩니다. 각 호출은 더 깊은 호출의 반환 값을 무시합니다. 어쨌든 동일한 목록에 액세스 할 수 있기 때문에 최상위 수준의 호출자는 모든 수준의 출력을 반환합니다. 목록을 변경할 수 있습니다로

가리스트, 튜플보다 저장을위한 더 좋은 생각이지만, 각각의 이동에 대한 두 개의 튜플이 합리적인 것 같다,

results == [(1, 2), (1, 3), (2, 3)] 
+0

죄송합니다. 귀하의 솔루션을 이해하지 못했습니다. 하노이 함수의 관점에서 설명 할 수 있습니까? – user2396041

+0

일부 이름을 변경했지만 원칙은 재귀 함수의 정확한 특성과 별개입니다. – jonrsharpe