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