2015-01-19 2 views
1

나는 사용자가 0을 입력 할 때까지 사용자의 숫자 목록을 얻은 다음이 숫자 목록의 모든 순열을 인쇄하는 프로그램을 Python으로 작성해야합니다. 코드를 작성하는 중이었습니다.이 코드는 처음부터 올바르게 보였습니다. 그러나 어떤 이유로 나는 이상한 결과를 얻고 있습니다.파이썬에서 입력 숫자 목록의 순열

목록이 정적 인 것처럼 보이고 함수가 반환 할 때마다 최신 목록에 개체가 추가됩니다. 이것은 함수가 재귀 적으로 호출되기 전과 같은 방식으로 발생하지 않습니다.

[1, 1, 1] 
[1, 1, 1, 2] 
[1, 1, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1] 
[1, 1, 1, 2, 3, 2, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1, 2, 3] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2] 
[1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3, 3, 1, 1, 2, 3, 2, 1, 2, 3, 3, 1, 2, 3] 

내가 어떤 도움을 주셔서 감사합니다 :

def permutation(numberList,array,place): 
     if (place==len(numberList)): 
      print array 
     else: 
      x=0 
      while (x < len(numberList)): 
       array.append(numberList[x]) 
       permutation(numberList,array,place+1) 
       x+=1 

    def scanList(): 
     numberList=[]; 
     number=input() 
     #keep scanning for numbers for the list 
     while(number!=0): 
      numberList.append(number) 
      number=input() 
     return numberList 

permutation(scanList(),[],0) 

이 예를 들어 입력 1 2 3 0의 출력입니다 : 여기

는 내가 지금까지 가지고있는 것입니다.

+0

가능한 [Python에서 모든 순열을 생성하는 방법] (http://stackoverflow.com/questions/104420/how-to-generate-all-permutations-of-a-list-in-python) – mbomb007

답변

1

사실, 파이썬에서 목록 []은 동적입니다. 따라서 array.append(numberList[x])으로 요소를 추가하면 영원히 거기에 머물러 있습니다. 실제로 깊이 우선 탐색 알고리즘을 작성하는 일반적인 방법이다

def permutation(numberList,array,place): 
    if (place==len(numberList)): 
     print(array) 
    else: 
     x=0 
     while (x < len(numberList)): 
      array.append(numberList[x]) 
      permutation(numberList,array,place+1) 
      array.pop() 
      x+=1 

을 : 그냥 재귀 호출 후 추가 된 요소를 제거하여 구조를 수정 재귀 호출을, 수정을 취소. 프로그램의 결과는 입력의 permutations 인 것을 보이지 않는다.

+0

당신 말이 맞아요, 그렇지 않아요, 전 그냥 순열이 숫자를 반복해서는 안된다는 것을 알았습니다. 무엇이 잘못되었는지 궁금합니다. 대답은 완벽합니다! – Ryan

1

파이썬 방법은 itertools를 사용하는 것입니다.

from itertools import permutations 
for permutation in permutations([1,2,3]): 
    print(permutation) 

알고리즘이 잘못되었습니다. 당신이 알아 차렸 듯이 목록은 고정적입니다 (실제로는 아니지만 매번 같은 목록을 사용하는 경우)

간단한 수정은 매번 목록을 복사하는 것입니다.

def permutation(numberList,array,place): 
    if (place==len(numberList)): 
     print array 
    else: 
     x=0 
     while (x < len(numberList)): 
      array2 = array[:] // here happens the copy 
      array2.append(numberList[x]) 
      permutation(numberList,array2,place+1) 
      x+=1 
+0

만약 내가 그 일을 이미 할 수 있었다면, 그것은 숙제입니다. 그래도 고마워. – Ryan

+0

@ Ryan 이것이 파이썬을 사용하는 것이 아니라면 [tag : algorithms] 태그를 사용하십시오. –