kdb - 迭代 (/) 多价函数
问题描述
你如何迭代一个多价秩(> 1)的函数,例如f:{[x;y] ...}
下一个迭代步骤中的函数输入取决于最后一个迭代步骤?参考手册中的示例仅迭代一元函数。
通过将参数字典(状态)传递给一元函数,我能够间接(并且冗长地)实现这一点:
f:{[arg] key[arg]!(min arg;arg[`y]-2)}
f/[{0<x`x};`x`y!6 3]
请注意,例如投影f[x;]/[whilecond;y]
仅x
在下一个迭代步骤中的不依赖于上一次迭代的结果(即当 x 与路径无关时)的情况下才有效。
解决方案
关于 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
或者,您可以使用 .zs self 函数,该函数递归调用函数 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
推荐阅读
- jenkins - Jenkins 管道无法在 pod 中执行 docker 命令
- java - 为什么这段代码的结果是不确定的?
- sql-server - 创建名称包含变量的表
- java - 如何从多部分文件中提取正文和文件名?
- c++ - 为什么使用“新”运算符?
- python-3.x - 使用 unittest.mock,如何模拟成员字段的方法?
- javascript - 如何更改 D3 矩形中现有的 html 文本?
- javascript - 添加一个大数并返回一个非科学计数法数字
- javascript - 在 React js 中使用一些渲染数组元素
- laravel - 如何为表单中的所有输入文件制作 laravel 验证器