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