【问题标题】:imitating permutation function in mathematica using functional programming使用函数式编程模仿数学中的置换函数
【发布时间】:2012-11-01 15:11:41
【问题描述】:

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

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]

这段代码的结果是:

{1,1}
{1,2}
{1,3}
{2,1}
{2,2}
{2,3}
{3,1}
{3,2} 
{3,3}

现在我想知道如何使用函数式编程来做到这一点,也许是 Nest 或 NestWhile...

【问题讨论】:

  • 不管你怎么做,矩阵不会一样大吗?
  • 我不是专业人士,但我知道如何使用递归函数更快。
  • 代码的结果看起来更像笛卡尔的乘法(集合 A 自身相乘)而不是排列。我想,如果你在标题中使用这个词,你会得到更具体的帮助。

标签: functional-programming wolfram-mathematica permutation


【解决方案1】:

如果您只请求长度为 2 的排列,Mathematica 可以相当快地返回结果。

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

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

Permutations[Range[500]]

【讨论】:

  • 好吧,我的问题不限于两个,它可能会增加到 7 或 10,这是一个可以重复的过程。
  • 我明白了。让我考虑一下。
猜你喜欢
  • 2018-11-12
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2010-09-06
  • 2010-11-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多