0

문자열의 모든 순열을 인쇄하려고합니다. 그러나 최선의 노력에도 불구하고 필자의 코드에 필요한 출력을 얻을 수 없습니다. 누군가 내 코드에 어떤 문제가 있는지 설명 할 수 있습니까? 나는 이것을 여러 시간 동안 시도해 왔으며 비참하게 실패했다.문자열의 모든 조합을 인쇄 할 때 역 추적이 작동하지 않습니까?

아래 코드의 출력은 : -

ABC

이 철수 대한 변경하다 함수이다 : -

int i, l = 2; 
void permute(String str, int n) 
{ 
    for(i=n;i<=l;i++) 
    { 
     if(n==l) 
     { 
      System.out.println(swap(str,n,i)); 
      return; 
     } 
     else 
      permute(swap(str,n,i),n+1); 
    } 
} 

이 상기 코드를 실행하는 메인 함수이다 : -

public static void main(String args[]) 
{ 
    BacktrackTest bt=new BacktrackTest(); 
    String c="abc"; 
    bt.permute(c,0); 
} 

스왑 코드입니다 : -

String swap(String st, int s1, int s2) 
{ 
    char chr[] = st.toCharArray(); 
    char t; 
    t = chr[s1]; 
    chr[s1] = chr[s2]; 
    chr[s2] = t; 
    st = String.valueOf(chr); 
    return st; 
} 
+0

for 루프 'i ++'에서 그 증가 조건을 그대로 유지해야합니까? 'i -'일 것이 아닌가? – Omoro

+0

n은 문자열의 시작 색인이고 l은 끝입니다. 루프는 n에서 l로 실행됩니다. 그래서, 내가 있어야합니다 + + –

+0

당신의 코드를 시도하고 그것은 잘 작동합니다. 그것은 자체 라인에 각 순열과 함께'abc acb bac bca cba 택시'를 출력합니다. 실행중인 코드가 질문의 코드와 동일합니까? 편집 : 내 나쁜, 복사 할 때 약간의 수정을 복사, 내 대답을 참조하십시오. – walen

답변

0

permute 메서드 외부에 i을 정의하지 마십시오. 이 시도 :

int l = 2; 
void permute(String str, int n) 
{ 
    for(int i=n;i<=l;i++) 
    { 
     if(n==l) 
     { 
      System.out.println(swap(str,n,i)); 
      return; 
     } 
     else 
      permute(swap(str,n,i),n+1); 
    } 
} 

을 당신이 for 루프 외부 i를 선언하면,이 값이 반환 후 발신자에 대해 "복원"그렇죠.
예에서 if(n==l)을 입력하면 i의 값은 2이지만 return; 이후에는 전체 범위로 인해 여전히 2입니다. 따라서 다음 반복에서 3으로 증가하므로 i<=l이 false로 바뀌고 프로그램이 종료됩니다.
return; 후에 i을 루프 내에 선언하면 루프가 계속 될 수 있으므로 1로 돌아갑니다.

+0

당신이 저를 구원해주었습니다! 그것은 효과가있다! –

+0

이것이 왜 문제가되는지 힌트를 주시기 바랍니다. –

+0

그래, 그냥 설명을 추가했습니다. – walen