(*按字典顺序嵌套括号。*)(* ---------------------------------------------------------------- *)(*返回长度为2*n,in*的括号的C(n)字符串)(*字典顺序,对于n>=2.*)(*参见Donald E.Knuth,《计算机编程的艺术》*)(*第4A卷:组合算法,第1部分,Addison-Wesley,2011,*)(*第7.2.1.6节,第443页,算法P.*)algP[n-Integer/;n>=2]:=块[{a=压扁[表[{“(”,“)”},n]],m=2*n-1,j,k,p},StringJoin(字符串连接)/@收割[虽然[正确,母猪[a];a[[m]]=“)”;如果[a[[m-1]]==“)”,a[[--m]]=“(”,j=m-1;k=2*n-1;而[j>1&&a[[j]]==“(”,a[[j-]]=“)”;a[[k]]=“(”;k-=2];如果[j==1,则中断[]];a[[j]]=“(”;m=2*n-1]]][[2, 1]]];(*示例:生成长度不超过10*的所有字符串)联接[{“()”},数组[algoP,4,2]](*取消排列嵌套括号字符串。*)(* ---------------------------------------------------------------- *)(*给定r和n,其中1<=r<=C(n),返回第r个字符串*)(*(按字典顺序)长度为2*n.*的嵌套括号)(*参见Donald E.Knuth,《计算机编程的艺术》*)(*第4A卷:组合算法,第1部分,Addison-Wesley,2011,*)(*第7.2.1.6节,第452页,算法U.*)algoU[r_Integer,n_Integer]:=块[{a=表[“)”,2*n],q=n,m,p,c,c1,i=r},如果[r<1||r>CatalanNumber[n],则返回[“Invalid parameters.”]];m=p=c=1;而[p<n,c=(++p*4-2)*c/(p+1)];当[q>0时,c1=(q+1)*(q-p)*c/((q+p)*(q-p+1));如果[i<=c1,问题--;c=c1;m++,p--;c-=c1;i-=c1;a[[m++]]=“(”]];字符串连接[a]];(*示例:返回长度为10*的第21个字符串)算法[21,5](*对照algoP*的输出进行检查)算法[5][[21]]