Functional programming 用函数编程模拟mathematica中的置换函数

Functional programming 用函数编程模拟mathematica中的置换函数,functional-programming,wolfram-mathematica,permutation,Functional Programming,Wolfram Mathematica,Permutation,我正在创建一个集合的所有可能排列,比如{1,2,3},因为我每次可以选择两个数字。我知道这可以使用置换函数来完成,但我的列表可能非常大,在创建了如此巨大的矩阵之后,对其进行任何操作都需要花费太长的时间。因此,我编写了以下递归函数,实现了我想要的功能: h=Table[Null,{}] myset = {1, 2, 3}; numOfBins = 2; h=Table[Null,{numOfBins}]; rec[x_] := ( If[ x <= numOfBins,

我正在创建一个集合的所有可能排列,比如{1,2,3},因为我每次可以选择两个数字。我知道这可以使用置换函数来完成,但我的列表可能非常大,在创建了如此巨大的矩阵之后,对其进行任何操作都需要花费太长的时间。因此,我编写了以下递归函数,实现了我想要的功能:

h=Table[Null,{}]    
myset = {1, 2, 3};
numOfBins = 2;
h=Table[Null,{numOfBins}];
rec[x_] := (
   If[
    x <= numOfBins,
    Do[
     h[[x]] = j; 
     rec[x + 1],
     {j, 1, Length[myset]}
     ],
    Print[h]
    ]
   );
rec[1]

现在,我想知道如何使用函数编程(可能是使用Nest或Nest)来实现这一点,而…

如果只请求长度为2的排列,Mathematica可以很快返回结果

AbsoluteTiming[Permutations[Range[500], {2}]]

Mathematica不会首先生成所有排列,然后选择长度为2的排列。它甚至无法处理查找500个项目列表的所有排列的任务

Permutations[Range[500]]

不管你怎么做,矩阵不是都一样大吗?我不是专家,但我知道使用递归函数会更快。代码的输出部分看起来更像笛卡尔的乘法(集a自身相乘),而不是置换。我想,如果你在标题中使用这个词,你会得到更具体的帮助。我的问题不限于两个,它可能会增加到7或10,这是一个可以重复的过程。我明白了。让我想一想。
Permutations[Range[500]]