加泰罗尼亚排名和取消排名功能的源代码
目录
C语言实现
/*尚未完成*/ #ifdef要求_LONG_LONG typedef 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位,大小n=15,64位,大小n=31*/ typedef SLLI等级;/* 使用32位,我们可以将大小提高到n=19,而64位则更远*/ typedef int SIZE; 加泰罗尼亚排名(尺寸n,TBBS a) { int m=-1; 整数y=0; 等级r=0; 而(a>0) { 如果(0==(a&1)) { m++; } 其他的 { y++; r+=猫三角形(m,y); } a>>=1; } 收益(r); } TBBS CatalanUnrank(尺寸n,等级r) { int 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,3511102755721001,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, 15, 119, 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, 25, 324, 2898, 20097, 115101, 566370, 2459664, 9612108, 34295052, 112971936, 346618440, 997490844, 2707475148, 6962078952, 17018415216, 39645171810, 88152205554, 187187399448, 379300783092, 731508653106, 1335293573130, 2282138106804, 3572042254128, 4861946401452, 4861946401452, 0}, {0, 1, 26, 350, 3248, 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, 27, 377, 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_exp { 结构s_exp*s_car;/* 即二叉树的左分支*/ 结构s_exp*s_cdr;/* 即----“”----的右分支*/ }; typedef结构s_exp SEXP_cell; 类型定义SEXP_cell*SEXP; #定义NULLP==NULL #定义对(!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; 静态等级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*重复使用) { int m=n-1; 整数y=n; 整数sp=0; int rightson=0; SEXP根=NULL; SEXP传感器堆栈[MAXSIZE+1]; 而(m>=0) { 等级c=CatTriangle(m,y); 如果(r>=c) { SEXP newbranch=recons(NULL、NULL、重用); if(NULLP(根)){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!\n”); fflush(标准错误)*/ SET_CAR(新电池,车载); SET_CDR(新小区,cdrside); return(newcell); } /*一头扎进车侧,找到第一个囚犯牢房 CAR或CDR端为NULL, 并返回该单元格, 供侦察人员重复使用 */ SEXP脱网(SEXP*副站) { SEXP z; if(NULLP(CAR(*代位)) { z=*副缆绳; *subtrot=CDR(z); 返回(z); } if(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-1 fi; a:=iquo(a,2) od; A014137号 (m) -吨 结束时间: #序列( A215406型 (i) ,i=0..199);
#然而,此版本的 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号 (将其作为一个列表生成到一定大小的旧方法): CatalanSequences:=proc(upto_n)local 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); 结束;
#这将返回列表的第一个元素,并以 #一些非常古老的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 #第2部分不精确([[],[]]);-> 10 1010 #pars2binexp([[]]]);-> 12 1100 #pars2binexp([[],[],[]]);-> 42 101010 #pars2binexp([[],[[]]]);-> 44 101100 #pars2binexp([[]],[]]);-> 50 110010 #pars2binexp([[],[]]]);-> 52 110100 #pars2binexp([[[]]]);-> 56 111000 pars2binexp:=进程(p)局部e、s、w、x; 如果(0=nops(p)),则返回(0); fi; e:=0; 对于p中的s 做 x:=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 CAR NextBalSubSeq:=进程(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),则RETURN(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号 :=程序(n)局部nn,i;# 是:floor_log_2 nn:=n; 对于i从-1到n 做 如果(0=nn),则返回(i); fi; nn:=楼层(nn/2); od; 结束;
Mathematica中的实现
Python/SAGE实现
定义 A080116号 (n) : lev=0 当n>0时: lev+=(-1)^n 如果lev<0:返回0 n=无/无2 如果lev>0,则返回0,否则返回1 定义 A215406型 (n) :#加泰罗尼亚排名全球(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)/2 mn=二项式(u,v)-二项式 t+=mn*(1-a%2) y-=(-1)^a a=a//2 返回 A014137号 (m) -吨
在方案中实施
(定义( 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+y) (-等级c) (A009766tr米(-1+年)) ) (回路(*2a);; 一直到谷底 (-1+m) 年 等级 (A009766tr(-1+m)年) ) ) ) ) ) ;; 的反函数 A014486号 : (定义( A080300型 n) (第二个(零( A080116号 n) )0)(其他(加泰罗尼亚排名全球n)) (定义(CatalanRankGlobal a) (如果(零?a) 0 (let((w/2(/(binwidth a)2))) (+ ( A014137号 (-1+w/2)) (加泰罗尼亚排名w/2 a) ) ) ) ) (定义(加泰罗尼亚排名w/2 a) (let loop(a a);; 完全平衡的二进制扩展 (第0位) (低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)) 年 ) (loop;;向上爬到山的高处。 (地板->精确(/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 0 A000108号 )) (定义( A072643号 n) (第一个pos,带有funs_val_gte A014137号 (1+n)) (定义(first_pos_with_funs_val_gte函数n) (let循环((i 0)) (如果(>=(fun i)n)i (回路(1+i)) ) ) ) (定义( A080116号 c) ;; 的特征函数 A014486号 (let循环((c c)(lev 0)) (条件((零?c)(如果(零?lev)10)) ((<lev 0)0) (否则 (环路(地板->精确(/c 2))(+lev(-1(*2(模数c 2)))) ) ) ) ) (定义(箱宽n)= A029837号 (n+1) (let循环((n n)(i 0)) (如果(零?n) 我 (回路(地板->精确(/n 2))(1+i)) ) ) )
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))) (否则 (设置!等级(+等级(A009766tr m y)) (设置!y(-1+y)) (TreeRank(汽车节点)) (TreeBank(cdr节点)) ) ) ) 等级 ) ) (定义(CatalanRankSexp) (let(大小(count-pars)) (如果(零尺寸) 0 (+ ( A014137号 (-1+大小))(CatalanRankSexpAux大小) ) ) ) ;; 直接将秩(整数)取消为无符号S表达式。 ;; 请参阅Frank Ruskey的论文: ;; http://webhome.cs.uvic.ca/ ~ruskey/出版物/论文/论文.html ;; 尤其是第24页: ;; http://webhome.cs.uvic.ca/ ~ruskey/出版物/论文/论文Page24corrected.png (定义(加泰罗尼亚UnrankSexpAux大小等级) (let((sonstack(make-vector大小)) (根目录(列表)) ) (let循环(m(-1+大小));; 上的行 A009766号 (y尺寸);; 第m行上的位置 A009766号 (排名) (c(A009766tr(-1+尺寸)尺寸) (右?#f) (第0页) ) (如果(负?m)根 (秒 ((>=等级c) (let((newbranch(cons(list)(列表))) (第二 ((null?root)(set!root newbranch) (右上?(set-cdr!(vector-ref-sonstack sp)newbranch) (其他(set-car!(vector-ref sonstack sp)newbranch) (设置!sp(1+sp)) ) ) ;; 康德 (vector-set!sonstack sp newbranch) (回路m (-1+y) (-等级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(计数pars(car a))(计数pars(cdr a))) ) )