q - while 循环中的内部状态

q - internal state in while loop

在 q 中,我试图在不满足某些条件时在递增参数 id 上调用函数 f

函数 f 创建一个 table 的随机长度(在 1 和 5 之间),其列 identifier 取决于输入 id:

f:{[id] len:(1?1 2 3 4 5)0; ([] identifier:id+til len; c2:len?`a`b`c)}

id=0 开始,f 应该在 (count f[id])>1 时调用,即直到生成长度为 1 的 table。 id 应每步递增。

用 "repeat" 副词我可以做 while 条件和起始值:

{(count x)>1} f/0

但是我怎样才能继续递增 id

不完全确定这是否会解决您的问题,但我能够通过在函数内部递增 id 并在每次迭代时返回它来使其工作:

q)g:{[id] len:(1?1 2 3 4 5)0; id[0]:([] identifier:id[1]+til len; c2:len?`a`b`c);@[id;1;1+]}

在这种情况下,id 是一个 2 元素列表,其中第一个元素是您要返回的 table(最初是 ()),第二个元素是 id.通过修改退出条件,只要输出 table 的计数为 1:

,我就可以让它停止
q)g/[{not 1=count x 0};(();0)]
+`identifier`c2!(,9;,`b)
10

如果你只需要 table 你可以 运行 first 上面表达式的输出:

q)first g/[{not 1=count x 0};(();0)]
identifier c2
-------------
3          a

函数 f 的问题在于,当使用 over 并扫描输出时,如果每次迭代都成为下一次的输入。在您的情况下,您的函数正在处理第二次传递的数值,它将通过 table.