2011-01-31 133 views
1

所以我想排列所有可能的n數字長x數組/元素組中的長數字。我想出了一個代碼,但是數字是一樣的,我怎麼防止這種情況發生。這裏是我來(帕斯卡):遞歸排列

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已經產生的排列具有很好的答案(見「相關」列到你的左邊)很多問題 – 2011-01-31 22:02:22

回答

1

這裏是Prolog的

代碼
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). 

Pascal是更難。

這裏是一個有用的算法,你可能想要使用。但它沒有經過測試,所以你必須自己調試它。所以你必須知道算法的工作原理。

貝爾置換算法: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.