2011-01-31 3 views
1

그래서 x 개의 긴 배열/요소 집합에서 가능한 모든 n 자리의 긴 숫자를 바꾸려고합니다. 나는 그것을하는 코드를 생각해 냈다. 그러나 숫자는 동일하다. 어떻게 그런 일이 일어나지 않도록 할까? 여기 내 (파스칼)왔다 :재귀 순열

여기
program Noname10; 

var stop : boolean; 
    A : array[1..100] of integer; 



function check(n : integer) : boolean; 
begin 
    if n = 343 // sets the limit when to stop. 
     then check := true 
     else check := false; 
end; 


procedure permute(p,result : integer); 
    var i : integer; 
begin 
    if not stop 
     then if p = 0 then 
      begin 

       WriteLn(result); 

       if check(result) 
        then stop := true 
      end 


     else for i := 1 to 9 do 
      begin 
       permute(p - 1, 10*result+i); 
      end; 


end; 


begin 
    stop := false; 
    permute(3,0); 
    readln; 
end. 
+0

(당신의 왼쪽에있는 "관련"열 참조) 아주 좋은 답변을 SO 이미 순열을 생성하는 방법에 대한 많은 질문이 있습니다 당신은 출력의 예를 작성할 수 –

+0

있습니다 너는 기대하고 있니? (실제로 순열을 생성하는 코드의 측면은 보이지 않으며 배열을 사용하고 있지 않음을 유의하십시오. 예를 통해 명확하게 설명 할 수 있습니다.) –

답변

1

permutate(As,[B|Cs]) :- select(B, As, Bs), permutate(Bs, Cs). 
select(A, [A|As], As). 
select(A, [B|Bs], [B|Cs]) :- select(A, Bs, Cs). 

?- permutate([a,b,c], P). 

파스칼가 훨씬 어렵습니다 프롤로그

의 코드입니다.

유용한 알고리즘은 다음과 같습니다. 하지만 테스트되지 않았으므로 직접 디버깅해야합니다. 알고리즘이 어떻게 작동하는지 알아야합니다.

벨 순열 알고리즘 : http://programminggeeks.com/bell-algorithm-for-permutation/

procedure permutate(var numbers: array [1..100] of integer; size: integer; 
        var pos, dir: integer) 
begin 
    if pos >= size then 
    begin 
    dir = -1 * dir; 
    swap(numbers, 1, 2); 
    end 
    else if pos < 1 then 
    begin 
    dir = -1 * dir; 
    swap(numbers, size-1, size); 
    end 
    else 
    begin 
    swap(numbers, pos, pos+1); 
    end; 
    pos = pos + dir; 
end; 

begin 
    var a, b: integer; 
    a = 1; b = 1; 
    while true do 
    begin 
     permutate(A, 5, a, b); 
     printArray(A, 5); 
    end; 
end.