Recursion 递归置换

Recursion 递归置换,recursion,permutation,pascal,Recursion,Permutation,Pascal,所以我尝试将x长数组/元素集中所有可能的n位长数字进行置换。我已经想出了一个代码,可以做到这一点,但是数字是相同的,我如何防止这种情况发生。下面是我的答案(帕斯卡): 下面是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,

所以我尝试将x长数组/元素集中所有可能的n位长数字进行置换。我已经想出了一个代码,可以做到这一点,但是数字是相同的,我如何防止这种情况发生。下面是我的答案(帕斯卡):


下面是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).
帕斯卡更难

这是一个有用的算法,您可能需要使用。但是它没有经过测试,所以您必须自己调试它。所以你必须知道算法是如何工作的

Bell置换算法:

过程置换(变量编号:整数的数组[1..100];大小:整数;
变量位置,目录:整数)
开始
如果pos>=大小,则
开始
dir=-1*dir;
互换(数字1、2);
结束
否则,如果位置<1,则
开始
dir=-1*dir;
交换(数字、大小1、大小);
结束
其他的
开始
交换(编号、pos、pos+1);
结束;
pos=pos+dir;
结束;
开始
变量a,b:整数;
a=1;b=1;
尽管如此
开始
置换(A,5,A,b);
打印阵列(A,5);
结束;
结束。

以下是序言中的代码

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).
帕斯卡更难

这是一个有用的算法,您可能需要使用。但是它没有经过测试,所以您必须自己调试它。所以你必须知道算法是如何工作的

Bell置换算法:

过程置换(变量编号:整数的数组[1..100];大小:整数;
变量位置,目录:整数)
开始
如果pos>=大小,则
开始
dir=-1*dir;
互换(数字1、2);
结束
否则,如果位置<1,则
开始
dir=-1*dir;
交换(数字、大小1、大小);
结束
其他的
开始
交换(编号、pos、pos+1);
结束;
pos=pos+dir;
结束;
开始
变量a,b:整数;
a=1;b=1;
尽管如此
开始
置换(A,5,A,b);
打印阵列(A,5);
结束;
结束。

关于生成排列,已经有很多问题了,因此,如果答案很好(请参见左侧的“相关”列),您能写出一些您期望的输出示例吗?(我看不到代码中实际会创建置换的方面。还要注意的是,您没有使用数组。这些示例可能会澄清一些问题。)关于生成置换,已经有很多问题,答案非常好(请参见左侧的“相关”列)。您能写出一些您期望的输出示例吗?(我看不到代码中实际会创建置换的方面。还要注意的是,您没有使用数组。示例可能会澄清一些问题。)
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.