刚才测试了下递归的fx、gx,貌似fx的快一点,i7 12700k大约10秒。后来将fx从名称管理器中取出,整合到单个函数中,速度快一倍,5秒就行了。看来这和调用名称管理器的函数相比,机制明显不同。
=LET(na,SEQUENCE(81),nb,SEQUENCE(9),fx,LAMBDA(fx,z,IF(AND(z>0,z<10),z,LET(行,LAMBDA(x,INT((x-1)/9)+1),列,LAMBDA(x,MOD(x-1,9)+1),九宫,LAMBDA(x,INT(MOD(x-1,9)/3)+1+3*INT((x-1)/27)),筛,LAMBDA(x,y,FILTER(z,x=y)),位置,MATCH(0,z,),行判,筛(行(na),行(位置)),列判,筛(列(na),列(位置)),九宫判,筛(九宫(na),九宫(位置)),备选,TOCOL(nb/ISNA(MATCH(nb,VSTACK(行判,列判,九宫判),)),3),IFNA(IFS(SUM(N(z=0))=1,IF(na=位置,备选,z),COUNT(备选)=0,z),DROP(REDUCE(0,备选,LAMBDA(m,n,HSTACK(m,IFERROR(fx(fx,IF(na=位置,n,z)),IF(na=位置,"@",z))))),,1))))),s,REDUCE(TOCOL(--B2:J10),ROW(1:4),LAMBDA(x,y,LET(u,IF(y=1,x,FILTER(x,BYCOL(x,LAMBDA(v,OR(v="@")+AND(v>0,v<10))))),DROP(REDUCE(0,SEQUENCE(COLUMNS(u)),LAMBDA(m,n,HSTACK(m,fx(fx,N(INDEX(u,,n)))))),,1)))),WRAPROWS(TAKE(FILTER(s,BYCOL(s,LAMBDA(x,NOT(OR(x=0))))),,1),9)) |