如何在KDB中遍历M*N网格

如何在KDB中遍历M*N网格,kdb,Kdb,如何在Qlang中遍历m*n网格,您可以向上、向下或对角遍历。 找出达到终点的可能途径 如下图所示: 一种方法是使用.z.s递归调用具有不同参数的初始函数,并求和以给出路径总数 f:{ // When you reach a wall, there is only one way to corner so return valid path if[any 1=(x;y);:1]; // Otherwise spawn 3 paths - one up, one right and o

如何在Qlang中遍历m*n网格,您可以向上、向下或对角遍历。 找出达到终点的可能途径

如下图所示:


一种方法是使用
.z.s
递归调用具有不同参数的初始函数,并求和以给出路径总数

f:{
  // When you reach a wall, there is only one way to corner so return valid path
  if[any 1=(x;y);:1];
  // Otherwise spawn 3 paths - one up, one right and one diagonally
  :.z.s[x-1;y] + .z.s[x;y-1] + .z.s[x-1;y-1] 
}

q)f[2;2]
3
q)f[2;3]
5
q)f[3;3]
13
如果沿边而非正方形移动,可以将第一条线更改为:

if[any 0=(x;y);:1];
一个封闭形式的解决方案就是找到边界,当你沿着边界移动时,可以实现类似这样的方法

d:{
  k:1+min(x;y);
  f:{prd 1+til x};
  comb:{[f;m;n] f[m] div f[n]*f[m-n]}[f];
  (sum/) (2 xexp til k) * prd (x;y) comb/:\: til k
 }

q)d[3;3]
63f
对于较大的电路板,这要快得多,因为我认为第一种解决方案的复杂度是O(3^m+n),而第二种解决方案的复杂度是O(m*n)


这个问题需要更多的信息,一个可复制的例子,一个起点和/或一个期望的结果加上它的树遍历,下面马克的解决方案可以帮助我
d:{
  k:1+min(x;y);
  f:{prd 1+til x};
  comb:{[f;m;n] f[m] div f[n]*f[m-n]}[f];
  (sum/) (2 xexp til k) * prd (x;y) comb/:\: til k
 }

q)d[3;3]
63f
q)\t f[7;7]
13
q)\t f[10;10]
1924
q)\t d[7;7]
0
q)\t d[100;100]
1