Wolfram mathematica 程序仍处于无限递归中

Wolfram mathematica 程序仍处于无限递归中,wolfram-mathematica,wolfram-language,Wolfram Mathematica,Wolfram Language,我试图使用Wolfram Mathematica创建一个合并排序,但我仍然得到这个递归错误,我不知道我在哪里出错。我从Java重写了这段代码,在Java中它工作得很好,所以我想这对Wolfram来说是一件特别的事情。你知道我的代码有什么问题吗 非常感谢 Heer是我的代码: mergeSort[x_, left_, right_] := Module[{array = x, middle, n1, n2, L, R, i, j, k}, If[left < right,

我试图使用Wolfram Mathematica创建一个合并排序,但我仍然得到这个递归错误,我不知道我在哪里出错。我从Java重写了这段代码,在Java中它工作得很好,所以我想这对Wolfram来说是一件特别的事情。你知道我的代码有什么问题吗

非常感谢

Heer是我的代码:

mergeSort[x_, left_, right_] := 
 Module[{array = x, middle, n1, n2, L, R, i, j, k}, 
  If[left < right,
    middle = (left + right) / 2;
    
    mergeSort[array, left, middle];
    mergeSort[array, middle + 1, right];
    
    n1 = middle - left + 1;
    n2 = right - middle;
    
    L = {};
    R = {};
    
    For[i = 1, i < n1, ++i,
     L[[i]] = array[[left + 1]];
     ];
    For[j = 1, j < n2, ++j,
     R[[j]] = array[[middle + 1 + j]];
     ];
    
    i = 0;
    j = 0;
    k = left;
    
    While[i < n1 && j < n2,
     If[L[[i]] <= R[[j]],
      array[[k]] = L[[i]];
      i++;
      ,
      array[[k]] = R[[j]];
      j++;
      ];
     k++;
     ];
    
    While[i < n1, 
     array[[k]] = L[[i]];
     i++;
     k++;
     ];
    
    While[j < n2,
     array[[k]] = R[[j]];
     j++;
     k++;
     ];
    Return[array];
    ];
  ]
mergeSort[x,左,右]:
模[{array=x,middle,n1,n2,L,R,i,j,k},
如果[左<右,
中间=(左+右)/2;
合并排序[数组,左,中];
合并排序[数组,中间+1,右];
n1=中间-左侧+1;
n2=右-中;
L={};
R={};
对于[i=1,i如果[L[[i]]代码中有三个主要问题

  • 您试图调整的GfG代码通过引用传递数组
    arr
    ,因此每个递归都在同一个对象上运行。这在Mathematica中通常不会发生。我添加了
    HoldFirst
    来传递
    array
    。另一种方法是将
    array
    从函数调用中删除并将其作为全局变量直接修改

    mergeSort[left_, right_] := Module[{},
      If[left < right,
       middle = Floor[(left + right)/2];
       mergeSort[left, middle];
       mergeSort[middle + 1, right];
       ...
    
    {3,58,98}

    注意这已经改变了
    数组的内容

    array
    
    {3,58,98}

    替代版本

    在Mathematica习语中,一个更具代表性的版本是

    merge[lis_List,{}]:=lis
    合并[{},列表]:=lis
    合并[{a_uu,ra_uu},{b_u,rb_uuu}]:=
    
    如果[a代码中有三个主要问题

  • 您试图调整的GfG代码通过引用传递数组
    arr
    ,因此每个递归都在同一个对象上运行。这在Mathematica中通常不会发生。我添加了
    HoldFirst
    来传递
    array
    。另一种方法是将
    array
    从函数调用中删除并将其作为全局变量直接修改

    mergeSort[left_, right_] := Module[{},
      If[left < right,
       middle = Floor[(left + right)/2];
       mergeSort[left, middle];
       mergeSort[middle + 1, right];
       ...
    
    {3,58,98}

    注意这已经改变了
    数组的内容

    array
    
    {3,58,98}

    替代版本

    在Mathematica习语中,一个更具代表性的版本是

    merge[lis_List,{}]:=lis
    合并[{},列表]:=lis
    合并[{a_uu,ra_uu},{b_u,rb_uuu}]:=
    
    如果[a Hm..我真的不知道如何解决这个问题,因为在其他语言如Java中,它只是工作。@我不知道它是如何工作的。也许你也应该发布Java代码。这是GfG-Hm的代码。我不确定如何解决这个问题,因为在其他语言如Java中,它只是工作。@我不知道它是如何工作的。也许你应该你也可以发布Java代码-