2011-01-31 3 views
1

J'essaie donc de permuter tous les nombres longs de n chiffres possibles sur x tableau/ensemble d'éléments. Je suis venu avec un code qui fait cela, mais les chiffres sont les mêmes, comment puis-je empêcher cela. Voici mon venu (Pascal):Permutation récursive

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

Il y a des questions NOMBREUX sur la génération permutations déjà en SO avec de très bonnes réponses (voir la colonne « associée » à votre gauche) –

+0

Pouvez-vous écrire quelques exemples de sortie vous attendez? (Je ne vois pas les aspects du code qui vont réellement créer des permutations Notez que vous n'utilisez pas le tableau Les exemples peuvent clarifier les choses.) –

Répondre

1

Voici le code dans 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 est beaucoup plus difficile.

Voici un algorithme utile que vous pourriez utiliser. Mais il n'est pas testé, vous devez donc le déboguer vous-même. Vous devez donc savoir comment fonctionne l'algorithme.

L'algorithme de Bell Permutation: 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.