本网站由以下捐款支持:OEIS基金会.

加泰罗尼亚排名和取消排名功能的源代码

来自OeisWiki
跳转到:航行,搜索


这篇文章需要做更多的工作。

请帮助扩展它!



这篇文章的页面是一个存根,请通过展开它来提供帮助。


本页提供了以下内容的实现加泰罗尼亚排名和取消排名功能在各种编程语言中。对于每种语言,至少在全平衡二进制序列(即。A014486号)将呈现。此外,如果语言S表达式(或任何类似的数据结构),然后直接在那里转换版本,在其他情况下(C,Haskell平面二叉树.

算法改编自Frank Ruskey的论文在某些情况下,从D.L.Kreher和D.R.Stinson的书中,组合算法、生成、枚举和搜索(CAGES),CRC Press(1999),第3.4节“加泰罗尼亚族”,第95-104页,给出了与前一种完全平衡二进制序列源基本相同的算法,尽管需要更多的“镜像步骤”以符合OEIS中采用的顺序(A014486号).


在C中实现

以下功能用于[1]

/*尚未完成*/#ifdef要求_LONG_LONGtypedef unsigned long long int ULLI;/*64位太阳上的两次长跑*/typedef long long int SLLI;/*同上*/#else/*我们在一些旧的32位小机器上*/typedef unsigned long int ULLI;/*只有一个长*/typedef long int SLLI;/*同上*/#结束语类型定义ULLI TBBS;/*TBBS=完全平衡的二进制序列。32位仅小于等于15,64位小于等于31*/typedef SLLI等级;/*使用32位,我们可以将大小提高到n=19,而64位则更远*/typedef int SIZE;加泰罗尼亚排名(尺寸n,TBBS a){整数m=-1;整数y=0;秩r=0;而(a>0){如果(0==(a&1)){m++;}其他的{y++;r+=猫三角形(m,y);}a>>=1;}收益(r);}TBBS加泰罗尼亚Unrank(尺寸n,等级r){整数m=n-1;整数y=n;TBBS a=0;而(m>=0){等级c=CatTriangle(m,y);a≤1;如果(r>=c){y--;a++;r-=c;}其他的{m--;}}申报(a);}/*注意:行和列都从-1开始*//*CatTriangle(r,m)的入口=CatTriangel(r,m-1)+CatTriangles(r-1,m)*/#定义CatTriangle(r,c)(tA009766[(r+2)][(c+1)])#ifdef仅32位#定义TR 21#其他#定义TR 34#结尾RANK tA009766[][TR+1]=/*完整版本中的34行*/{{0},{0, 0},{0, 1, 0}, {0, 1, 1, 0}, {0, 1, 2, 2, 0}, {0, 1, 3, 5, 5, 0},{0, 1, 4, 9, 14, 14, 0}, {0, 1, 5, 14, 28, 42, 42, 0},    {0, 1, 6, 20, 48, 90, 132, 132, 0},{0, 1, 7, 27, 75, 165, 297, 429, 429, 0},    {0, 1, 8, 35, 110, 275, 572, 1001, 1430, 1430, 0},{0, 1, 9, 44, 154, 429, 1001, 2002, 3432, 4862, 4862, 0},    {0, 1, 10, 54, 208, 637, 1638, 3640, 7072, 11934, 16796, 16796, 0},{0, 1, 11, 65, 273, 910, 2548, 6188, 13260, 25194, 41990, 58786, 58786, 0},{0, 1, 12, 77, 350, 1260, 3808, 9996, 23256, 48450, 90440, 149226, 208012,208012、0}中,{0, 1, 13, 90, 440, 1700, 5508, 15504, 38760, 87210, 177650, 326876, 534888,742900, 742900, 0}, {0, 1, 14, 104, 544, 2244, 7752, 23256, 62016, 149226, 326876, 653752,1188640, 1931540, 2674440, 2674440, 0}, {0,1,151119,663,2907,10659,33915,95931,245157,572033,1225785,2414425, 4345965, 7020405, 9694845, 9694845, 0}, {0, 1, 16, 135, 798, 3705, 14364, 48279, 144210, 389367, 961400, 2187185,4601610, 8947575, 15967980, 25662825, 35357670, 35357670, 0}, {0, 1, 17, 152, 950, 4655, 19019, 67298, 211508, 600875, 1562275, 3749460,8351070、17298645、33266625、58929450、94287120、129644790、129644790、0},{0, 1, 18, 170, 1120, 5775, 24794, 92092, 303600, 904475, 2466750, 6216210,14567280, 31865925, 65132550, 124062000, 218349120, 347993910, 477638700,477638700, 0}, {0, 1, 19, 189, 1309, 7084, 31878, 123970, 427570, 1332045, 3798795,10015005, 24582285, 56448210, 121580760, 245642760, 463991880, 811985790,1289624490, 1767263190, 1767263190, 0}#如果仅32位/*然后在第一行后面显示一个>4294967295的值*/,{0, 1, 20, 209, 1518, 8602, 40480, 164450, 592020, 1924065, 5722860,15737865, 40320150, 96768360, 218349120, 463991880, 927983760, 1739969550,3029594040, 4796857230, 6564120420, 6564120420, 0},{0, 1, 21, 230, 1748, 10350, 50830, 215280, 807300, 2731365, 8454225,24192090, 64512240, 161280600, 379629720, 843621600, 1771605360,3511574910, 6541168950, 11338026180, 17902146600, 24466267020,24466267020, 0}, {0, 1, 22, 252, 2000, 12350, 63180, 278460, 1085760, 3817125, 12271350,36463440, 100975680, 262256280, 641886000, 1485507600, 3257112960,6768687870, 13309856820, 24647883000, 42550029600, 67016296620,91482563640, 91482563640, 0}, {0, 1, 23, 275, 2275, 14625, 77805, 356265, 1442025, 5259150, 17530500,53993940, 154969620, 417225900, 1059111900, 2544619500, 5801732460,12570420330, 25880277150, 50528160150, 93078189750, 160094486370,251577050010, 343059613650, 343059613650, 0}, {0, 1, 24, 299, 2574, 17199, 95004, 451269, 1893294, 7152444, 24682944,78676884, 233646504, 650872404, 1709984304, 4254603804, 10056336264,22626756594, 48507033744, 99035193894, 192113383644, 352207870014,603784920024, 946844533674, 1289904147324, 1289904147324, 0}, {0,1,252324289820097,115101,566370,2459664,9612108,34295052,112971936, 346618440, 997490844, 2707475148, 6962078952, 17018415216,39645171810, 88152205554, 187187399448, 379300783092, 731508653106,1335293573130, 2282138106804, 3572042254128, 4861946401452,4861946401452, 0},{0,1,2635033248,23345,138446,704816,3164480,12776588,47071640,160043576, 506662016, 1504152860, 4211628008, 11173706960, 28192122176,67837293986, 155989499540, 343176898988, 722477682080, 1453986335186,2789279908316, 5071418015120, 8643460269248, 13505406670700,18367353072152, 18367353072152, 0}, {0,1,27377,3625,26970,165416,870232,4034712,16811300,63882940,223926516, 730588532, 2234741392, 6446369400, 17620076360, 45812198536,113649492522, 269638992062, 612815891050, 1335293573130, 2789279908316,5578559816632, 10649977831752, 19293438101000, 32798844771700,51166197843852, 69533550916004, 69533550916004, 0}, {0, 1, 28, 405, 4030, 31000, 196416, 1066648, 5101360, 21912660, 85795600,309722116, 1040310648, 3275052040, 9721421440, 27341497800, 73153696336,186803188858, 456442180920, 1069258071970, 2404551645100, 5193831553416,10772391370048, 21422369201800, 40715807302800, 73514652074500,124680849918352, 194214400834356, 263747951750360, 263747951750360, 0}, {0, 1, 29, 434, 4464, 35464, 231880, 1298528, 6399888, 28312548, 114108148,423830264, 1464140912, 4739192952, 14460614392, 41802112192, 114955808528,301758997386, 758201178306, 1827459250276, 4232010895376, 9425842448792,20198233818840, 41620603020640, 82336410323440, 155851062397940,280531912316292, 474746313150648, 738494264901008, 1002242216651368,1002242216651368, 0}, {0, 1, 30, 464, 4928, 40392, 272272, 1570800, 7970688, 36283236, 150391384,574221648, 2038362560, 6777555512, 21238169904, 63040282096, 177996090624,479755088010, 1237956266316, 3065415516592, 7297426411968, 16723268860760,36921502679600, 78542105700240, 160878516023680, 316729578421620,597261490737912, 1072007803888560, 1810502068789568, 2812744285440936,3814986502092304, 3814986502092304, 0}, {0, 1, 31, 495, 5423, 45815, 318087, 1888887, 9859575, 46142811, 196534195,770755843, 2809118403, 9586673915, 30824843819, 93865125915, 271861216539,751616304549, 1989572570865, 5054988087457, 12352414499425, 29075683360185,65997186039785, 144539291740025, 305417807763705, 622147386185325,1219408876923237, 2291416680811797, 4101918749601365, 6914663035042301,10729649537134605, 14544636039226909, 14544636039226909, 0}, {0,1,32,527,5950,51765,369852,2258739,12118314,58261125,254795320,1025551163, 3834669566, 13421343481, 44246187300, 138111313215,409972529754, 1161588834303, 3151161405168, 8206149492625, 20558563992050,49634247352235, 115631433392020, 260170725132045, 565588532895750,1187735919081075, 2407144796004312, 4698561476816109, 8800480226417474,15715143261459775、26444792798594380、40989428837821289、55534064877048198、,55534064877048198, 0}#结束语};/*当然,我们也可以在运行时计算它*/void CheckTriangle(int upto_n){整数r,m;对于(r=0;r<=upto_n;r++){对于(m=0;m<r;m++){如果((猫三角形(r,m-1)+猫三角形(r-1,m))!=三角猫(r,m){fprintf(stderr,“(CatTriangle(%d,%d)+CatTriangel(%d,%4))=”,r、 (m-1),(r-1),m);fprint_ulli(标准错误,(猫三角形(r,m-1)+猫三角形(r-1,m)));fprintf(stderr,“不同于CatTriangle(%d,%d)=”,r、 m);fprint_ulli(stderr,CatTriangle(r,m));fprintf(标准错误,“\n”);出口(1);}}如果((r>0)&&(CatTriangle(r,m)!=CatTriangle(r,m-1)){fprintf(stderr,“(CatTriangle(%d,%d)=”,r,m);fprint_ulli(stderr,CatTriangle(r,m));fprintf(stderr,“不同于CatTriangle(%d,%d)=”,r,(m-1));fprint_ulli(stderr,CatTriangle(r,m-1));fprintf(标准错误,“\n”);出口(1);}}/*fprintf(stderr,“三角形正常!\n”)*/}

S表达式的C实现

以下是直接从/到“虚无主义”排序和取消排序的版本S表达式,它必须在C中用struct关键字显式定义为新类型。此外,还必须定义某些辅助功能,如(re)cons。

结构s_exp{结构s_exp*s_car;/*即二叉树的左分支*/结构s_exp*s_cdr;/*即----“”----的右分支*/};typedef结构s_exp SEXP_cell;类型定义SEXP_cell*SEXP;#定义NULLP==NULL#定义PAIR(!NULLP)#定义CAR->s_CAR#定义CDR->s_CDR#定义SET_CAR(s,x)((s)->s_CAR)=x)#定义SET_CDR(s,x)((s)->s_CDR)=x)/*这当然不是重新进入。。。用另一种方式编码,例如,如果您需要一个并行版本。*/静态整型CRS_m,CRS_y;静态RANK CRS_r;void CatalanRankSexpAux(SEXP节点){if(NULLP(节点)){CRS_m-;}其他的{CRS_r+=CatTriangle(CRS_m,CRS_y);CRS_y--;CatalanRankSexpAux(CAR(节点));CatalanRankSexpAux(CDR(节点));}}评级CatalanRankSexp(SIZE n,SEXP节点){CRS_m=n-1;CRS_y=n;CRS_r=0;CatalanRankSexpAux(节点);返回(CRS_r);}SEXP CatalanUnrankSexp(尺寸n、等级r、SEXP*重复使用){整数m=n-1;整数y=n;整数sp=0;int rightson=0;SEXP根=NULL;SEXP sonstack[MAXSIZE+1];而(m>=0){等级c=CatTriangle(m,y);如果(r>=c){SEXP newbranch=recons(NULL、NULL、重用);if(NULLP(root)){root=newbranch;}其他的{if(rightson){SET_CDR(sonstack[sp],newbranch);}else{SET_CAR(sonstack[sp],newbranch);sp++;}}sonstack[sp]=新分支;y--;r-=c;rightson=0;/*下一个是一个左儿子*/}其他的{m--;sp-=rightson;rightson=1;/*下一个是一个右儿子*/}}返回(根);}加泰罗尼亚排名全球(规模n,TBBS a){如果(0==n){返回(0);}else{返回(A014137号(n-1)+加泰罗尼亚等级(n,a));}}对CatalanRankSexpGlobal进行排名(大小n,SEXP){如果(0==n){返回(0);}else{返回(A014137号(n-1)+加泰罗尼亚等级Sexp(n,s));}}SEXP缺点(SEXP carside,SEXP cdrside){SEXP newcell=((SEXP)calloc(1,sizeof(SEXP_cell));if(NULL==新单元格){fprintf(标准错误,“cons:无法分配一块%u字节来存储一个cons单元格!\n”,sizeof(SEXP_cell));出口(1);}/*fflush(标准输出);fprintf(stderr,“cons called!\n”);fflush(标准错误)*/SET_CAR(新电池,车载);SET_CDR(新小区,cdrside);return(newcell);}/*在车上冒险,找到第一个conscellCAR或CDR端为NULL,并返回该单元格,供侦察人员重复使用*/SEXP脱网(SEXP*副站){SEXP z;if(NULLP(CAR(*代位)){z=*副缆绳;*subtrot=CDR(z);返回(z);}如果(NULLP(CDR(*子程序)){z=*副缆绳;*副缆绳=CAR(z);返回(z);}返回(脱筏(&(CAR(*副起落架)));}/*这里是对将前一个S表达式转换为单独的自由列表(这意味着要把它压平!)在较大的S表达式上可能更快:*/SEXP侦察(SEXP carside、SEXP cdrside、SEXP*重用){if(NULLP(*重用)){return(cons(carside,cdrside));}其他的{SEXP z=脱模(重复使用);SET_CAR(z,车侧);SET_CDR(z,cdrside);返回(z);}}/*递归释放分配了cons的树*/void free_cons_tree(SEXP节点){if(NULLP(节点)){return;}if(!NULLP(CAR(节点)){free_cons_tree(CAR,节点));}if(!NULLP(CDR(节点)){free_cons_tree(CDR,节点));}自由(节点);}

Haskell中的实现

在Maple中的实现

#此版本的全球排名功能来自Peter Luschny,2012年8月10日:A215406型:=proc(n)局部m,a,y,t,x,u,v;m:=伊科(A070939号(n) ,2);答:=A030101型(n) ;y:=0;t:=1;对于从0到2*m-2的x如果irem(a,2)=1,则y:=y+1其他的u:=2*m-x;v:=m-1-iquo(x+y,2);t:=t+A037012号(u,v);y:=y-1fi;a:=iquo(a,2)od;A014137号(m) -吨结束时间:#序列(A215406型(i) ,i=0..199);

其余大部分是从安蒂·卡图恩的旧Maple-code集合.

#然而,此版本的A014486号于2012年8月19日编写,尚未与Maple进行测试:#参见。A213704型
A014486号:=n->`如果`(0=n,0,CatalanUnrank(A072643号(n) ,(n-A014137号(A072643号(n) -1));#的特征函数A014486号.A080116号:=proc(n)局部c,lev;水平:=0;c:=n;而(c>0)lev:=lev+(-1)^c;c:=地板(c/2);如果(lev<0),则返回(0);fi;od;如果(lev>0),则返回(0);否则返回(1);fi;结束;A080300型:=n->`如果`((0=n)或(0=A080116号(n) ),0,A014137号(((A000523号(n) +1)/2)-1)+A080301号(n) );A080301号:=n->`如果`(0=A080116号(n) ,-1,加泰罗尼亚排名((A000523号(n) +1)/2,n));加泰罗尼亚排名:=proc(n,aa)local y,r,lo,a;a:=aa;r:=0;y:=-1;lo:=0;而(a>0)如果(0=(模2))然后r:=r+1;lo:=lo+A009766号(r,y);其他的y:=y+1;fi;a:=地板(a/2);od;返回((二项式(2*n,n)/(n+1))-(lo+1));结束;CatalanUnrank:=进程(n,rr)局部t,y,lo,r,a,m;r:=(二项式(2*n,n)/(n+1))-(rr+1);a:=0;lo:=0;t:=n;y:=n-1;而(t>0)米:=A009766号(t,y);如果(r<(lo+m))然后y:=y-1;a:=2*a+1;其他的lo:=lo+m;t:=t-1;a:=2*a;fi;od;返回(a);结束;A009766号:=proc(r,m)选项记忆;如果(m<0),则返回(0);fi;如果(r<0),则返回(0);fi;如果(m>r),则返回(0);fi;如果(0=m),则返回(1);fi;返回(A009766号(r,m-1)+A009766号(r-1,m));结束;#替代变量:CatTrianglDirect:=(r,m)->`if`((m<0),0,(r-m+1)*(r+m)!)/(r!*m!*(r+1));CatalanRankGlobal:=proc(a)local n;n:=楼层(A070939号(a) /2);返回(加上((二项式(2*j,j)/(j+1)),j=0..(n-1))+加泰罗尼亚排名(n,a));结束;#给予A014486号(将其作为一个列表生成到一定大小的旧方法):加泰罗尼亚序列:=proc(upto_n)局部n,a,r;a:=[];对于从0到upto_n的n对于从0到(二项式(2*n,n)/(n+1))-1的r,做a:=[op(a),CatalanUnrank(n,r)];od;od;返回(a);结束;

某些加泰罗尼亚双射词的旧Maple实现也使用以下函数:

#这将返回列表的第一个元素,并以#一些非常古老的Lisp变体(Interlisp)返回一个空列表#空列表:car:=proc(l)如果0=nops(l),则([])else(op(1,l)):fi:结束:#这将返回列表的其余部分(尾部)(除#第一个元素),并以Interlisp的方式返回空列表#对于空列表:cdr:=proc(l)如果0=nops(l),则([])else(l[2..nops(1)]):fi:结束:#pars2binexp转换嵌套列表(括号)结构#按顺序使用的二进制代码A014486号.#示例:A014486号(n)A063171号(n) (二进制相同)#pars2binexp([]);->0                0#pars2binexp([[]]);->2               10#pars2binexp([[],[]]);->10             1010#pars2binexp([[]]]);->12             1100#pars2binexp([[],[],[]]);->42           101010#第2部分不精确([[],[[]]]);->44           101100#pars2binexp([[]],[]]);->50           110010#pars2binexp([[],[]]]);->52 110100个#pars2binexp([[[]]]);->56           111000pars2binexp:=进程(p)局部e、s、w、x;如果(0=nops(p)),则返回(0);fi;e:=0;对于p中的sx:=pars2binexp(s);w:电话:=A000523号(x) ;e:=e*2^(w+3)+2^(w+2)+2*x;od;返回(e);结束;#这是相反的:binexp2pars:=proc(n)选项记忆;`如果`((0=n),[],binexp2parsR(binrev(n)));结束;binexp2parsR:=n->[binexp2pars(PeelNextBalSubSeq(n)),op(binexp2pars(RestBalSubSeq(n)))];#与NextSubBinTree类似,但保留多余的零:#类似于Lisp CARNextBalSubSeq:=进程(nn)局部n,z,c;n:=nn;c:=0;z:=0;而(1=1)z:=2*z+(n模2);c:=c+(-1)^n;n:=地板(n/2);如果(c>=0),则返回(z);fi;od;结束;PeelNextBalSubSeq:=proc(nn)本地n,z,c;如果(0=nn),则返回(0);fi;n:=nn;c:=0;z:=0;而(1=1)z:=2*z+(n模2);c:=c+(-1)^n;n:=地板(n/2);如果(c>=0),则返回((z-2^(A000523号(z) ))/2);fi;od;结束;# RestBalSubSeq:=proc(nn)局部n,z,c;n:=nn;c:=0;而(1=1)c:=c+(-1)^n;n:=地板(n/2);如果(c>=0),则断裂;fi;od;z:=0;c:=-1;而(1=1)z:=2*z+(n模2);c:=c+(-1)^n;n:=地板(n/2);如果(c>=0),则返回(z/2);fi;od;结束;#从0位开始(应该是1),#这给出了完全平衡的子序列#1和0(包含在该“根”中),#然后是额外的零。#计数c包含剩余0的计数,每个#1将递减,每0递增一次。#当它到达1时,我们停下来。NextSubBinTree:=proc(nn)局部n,z,c;n:=nn;c:=0;z:=0;而(c<1)z:=2*z+(n模2);c:=c+(-1)^n;n:=地板(n/2);od;返回(z);结束;A000523号:=proc(n)本地nn,i;#曾为:floor_log_2nn:=n;对于i从-1到n如果(0=nn),则返回(i);fi;nn:=楼层(nn/2);od;结束;

Mathematica中的实现

Python/SAGE实现

完全平衡二进制序列特征函数的以下实现(A080116号)对于全局排名函数(A215406型)来自彼得·卢什尼2012年8月9日。

定义A080116号(n) :lev=0当n>0时:lev+=(-1)^n如果lev<0:返回0n=无/无2如果lev>0,则返回0,否则返回1定义A215406型(n) :#CatalanRankGlobal(n)米=A070939号(n) //2个一个=A030101型(n)y=0;t=1对于x in(1..2*m-1):u=2*m-x;v=m-(x+y+1)/2mn=二项式(u,v)-二项式t+=mn*(1-a%2)y-=(-1)^aa=a//2返回A014137号(m) -吨

在方案中实施

下面的功能已经过测试,可以使用MIT/GNU方案.代码来自http://www.iki.fi/kartturi/matikka/Nekomorphiism/gatorank.scm.txt,http://www.iki.fi/kartturi/matikka/Schemuli/intfun_a.scm.txthttp://www.iki.fi/kartturi/matikka/Schemuli/intfun_b.scm.txt

为了实施定义看见记忆.

(定义(A014486号n)(如果(零?n)0(A213704bi(A072643号n) (-n(A014137号(- (A072643号n) 1))))(定义(A213704双列)(第二((零行)0);;最上面一行全部为零。((>=列(A000108号行)0);;在其他行中,在C(n)完全平衡的二进制序列之后给零。(else(CatalanUnrank行列);;但在此之前,给出完全平衡的二进制序列。))(定义(CatalanUnrank大小等级)(let循环((a 0))(m(-1+尺寸));;上的行A009766号(y尺寸);;第m行上的位置A009766号(排名)(c(A009766tr(-1+尺寸)尺寸))(如果(负?m)a(如果(>=等级c)(回路(1+(*2a));;爬上高山(-1+年)(-等级c)(A009766tr米(-1+年)))(回路(*2a);;一直到谷底(-1+m)等级(A009766tr(-1+m)年))))));; 的反函数A014486号:(定义(A080300型n) (第二个(零(A080116号n) )0)(其他(加泰罗尼亚排名全球n))(定义(加泰罗尼亚排名全球a)(如果(零?a)0(let((w/2(/(binwidth a)2)))(+ (A014137号(-1+w/2))(加泰罗尼亚排名w/2 a)))))(定义(加泰罗尼亚排名w/2 a)(let loop(a a);;完全平衡的二进制扩展(第0位)(lo 0)(y-1))(如果(零?a)(-(/(C(*2 w/2)w/2)(1+w/2))(1+lo))(如果(零?(模a 2))(loop;;向下到山谷(地板->精确(/a 2));;是:(修复:lsh a-1);;a>>=1(1+r)(+lo(A009766tr(1+r)y)))(环游;;爬上高山。(地板->精确(/a 2));;是:(修复:lsh a-1)低(1+y))))))(定义(A009766tr r m)(如果(或(>m r)(<m 0))0 ;; 也许我们应该提出一个错误?!(/(*(1+(-r m))(!(+r m)))(*(!r)(!m)(1+r)))))(定义(!n)(如果(零?n)1(*n(!(-1+n))));;A000142号(定义A000108号(特征变换1*)(定义A014137号(部分金额0 0A000108号))(定义(A072643号n) (第一个pos,带有funs_val_gteA014137号(1+n))(定义(first_pos_with_funs_val_gte函数n)(让循环((i 0))(如果(>=(fun i)n)i(回路(1+i)))))(定义(A080116号c) ;;的特征函数A014486号(let loop((c c)(级别0))(条件((零?c)(如果(零?lev)10))((<lev 0)0)(否则(环路(地板->精确(/c 2))(+lev(-1(*2(模数c 2))))))))(define(料箱宽度n)=A029837号(n+1)(let循环((n n)(i 0))(如果(零?n)(回路(地板->精确(/n 2))(1+i)))))

S表达式的方案实现

以下变量直接从/到排序和取消排序S表达式.

;; 直接对无符号S表达式进行排序。;; 请参阅Frank Ruskey的论文:;; http://webhome.cs.uvic.ca/~ruskey/出版物/论文/论文.html;; 尤其是第19页:;; http://webhome.cs.uvic.ca/~ruskey/出版物/论文/论文Page19.png;; 这个增加了14个。2003年10月。;; 谢谢Frank,这让它变得更精简了!(定义(CatalanRankSexpAux大小节点)(let(m(-1+尺寸));;上的行A009766号(y尺寸);;第m行上的位置A009766号(排名0))(让TreeRank((节点节点))(cond((非(配对?节点))(设置!m(-1+m)))(否则(设置!等级(+等级(A00976t r m y)))(设置!y(-1+y))(TreeRank(汽车节点))(TreeBank(cdr节点)))))等级))(定义(CatalanRankSexp)(let((大小(计数部分)))(如果(零尺寸)0(+ (A014137号(-1+大小))(CatalanRankSexpAux大小))));; 直接将秩(整数)取消为无符号S表达式。;; 请参阅Frank Ruskey的论文:;; http://webhome.cs.uvic.ca/~ruskey/出版物/论文/论文.html;; 尤其是第24页:;; http://webhome.cs.uvic.ca/~ruskey/出版物/论文/论文Page24corrected.png(定义(CatalanUnrankSexpAux大小等级)(let((sonstack(make-vector大小))(根目录(列表)))(let循环(m(-1+大小));;上的行A009766号(y尺寸);;第m行上的位置A009766号(排名)(c(A009766tr(-1+尺寸)尺寸)(右?#f)(第0页))(如果(负?m)根(第二((>=等级c)(let((newbranch(cons(list)(列表)))(第二((null?root)(设置!root新分支))(右上?(set-cdr!(vector-ref-sonstack sp)newbranch)(其他(set-car!(vector-ref sonstack sp)newbranch)(设置!sp(1+sp)))) ;; 康德(vector-set!sonstack sp newbranch)(回路m(-1+年)(-等级c)(A009766tr米(-1+年))#f;;下次我们有一个左儿子。sp;;如果需要,sp已经增加到上面。)) ;; )(否则(回路(-1+m)等级(A009766tr(-1+m)年)#t;;下次我们有一个合适的儿子。(-sp(如果是rightson?10)))))))))(定义(CatalanUnrankSexp n)(let(尺寸(A072643号n) ))(CatalanUnrankSexpAux大小(如果(零?n)0(-n(A014137号(-1+尺寸)))))(定义(倒计时a)(条件(不是(对?a))0)(其他(+1(计数(汽车a))(计数(cdr a)))))