1

我正在創建一組所有可能的排列,比如{1,2,3},因爲我可以每次選擇兩個數字。我知道這可以使用排列函數來完成,但我的列表可能非常大,在創建這樣一個巨大的矩陣後,對它進行任何操作都需要很長時間。因此,我寫了下面的遞歸函數,做什麼,我想:使用函數式編程在mathematica中模擬排列函數

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 ...

+0

豈不矩陣是相同的巨大不管你怎麼做呢? –

+0

我不是專業人士,但一些如何使用遞歸功能更快。 –

+0

代碼的外觀看起來更像笛卡爾的乘法(將A乘以它自己)而不是置換。我想,如果你在標題中使用這個術語,你會得到更具體的幫助。 –

回答

0

如果您只請求那些長度爲2的排列,Mathematica可以相當快地返回結果。

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

permutations of length2

數學不首先生成所有排列,然後選擇那些長度爲2的它甚至不能處理髮現的500項列表的所有排列的任務。

Permutations[Range[500]] 

all permutations

+0

以及我的問題不僅限於兩個,它可能會增加到7或10,這是一個可以重複的過程。 –

+0

我明白了。讓我稍微想一想這件事。 – DavidC