代码之家  ›  专栏  ›  技术社区  ›  Daniel Krizian

迭代一个多价函数

kdb
  •  2
  • Daniel Krizian  · 技术社区  · 6 年前

    如何迭代多价秩函数(>1),例如 f:{[x;y] ...} 下一个迭代步骤中的函数输入依赖于上一个迭代步骤?实例 the reference manual 只迭代一元函数。

    通过将一元函数中的参数字典(state)传递给以下函数,我可以间接地(口头地)实现这一点:

    f:{[arg] key[arg]!(min arg;arg[`y]-2)}                                                          
    f/[{0<x`x};`x`y!6 3]
    

    注意投影,例如 f[x;]/[whilecond;y] 只适用于 x 在下一个迭代步骤中 取决于上一次迭代的结果(即,当x与路径无关时)。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rahul    6 年前

    与'/'和'\'一起使用的函数只能将上次迭代的结果作为单个项接受,这意味着只为结果保留1个函数参数。从这个意义上说,它是一元的。

    对于多个输入参数依赖于上一次迭代结果的函数,一种解决方案是将该函数包装在一元函数中,并使用Apply运算符对上一次迭代结果执行该函数。

    前任:

          q) g:{(min x,y;y-2)}  / function with rank 2
          q) f:{x . y}[g;]   / function g wrapped inside unary function to iterate
          q) f/[{0<x 0};6 3]
    
        2
  •  2
  •   Daniel Krizian    6 年前

    关于Rahul的答案,您可以使用以下方法之一(稍微不太冗长)来获得相同的结果:

    q)g:{(min x,y;y-2)}
    q)(g .)/[{0<x 0};6 3]
    -1 -3
    q).[g]/[{0<x 0};6 3]
    -1 -3
    

    或者,可以使用.z.s自函数,该函数递归调用函数g,并将上一次迭代的输出作为其参数。例如,

    q)g:{[x;y] x: min x,y; y:y-2; $[x<0; (x;y); .z.s[x;y]]}
    q)g[6;3]
    -1 -3