2011-01-31 90 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.