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