1
votes

Kdb / q: écrit une fonction qui continue de prendre la tête d'une liste, et retourne la valeur à la fin de la liste

Je veux maintenir une liste L. Donc je veux écrire une fonction func [] qui prend toujours la dernière table de la liste L, y travailler, retourner une valeur qui s'ajoute à la fin de L.

Par exemple

Soit L [a, b, c] func () prendra c, calculera d = func [c]

Maintenant L devient [a, b, c, d] func () prendra d, calculera e = func [d]

Maintenant L devient [a, b, c, d, e]

continue comme ça.

comment implémenter cela dans kdb / q?

kdb q

0 commentaires

3 Réponses :


4
votes

Do or while devrait vous permettre d'y parvenir, par exemple

q)l:0 2;f:{x,2*last x}
q)
q)5 f/ l           // do op 5 times
0 2 4 8 16 32 64
q)
q)(64>last@) f/ l  // perform op while last item in list is less than 64
0 2 4 8 16 32 64


0 commentaires

1
votes

Je pense que la fonction over est ce dont vous avez besoin. https://code.kx.com/q/ref/over/

q)l:1 2 3
q)f:{if[100<count x;:x];x,1+last x}
q)over[f;l]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29..

J'ai ajouté une condition pour briser la boucle en f. Lorsque vous utilisez over, si le même résultat est renvoyé deux fois, il s'arrêtera.

Vous pouvez également utiliser .zs. Cela répétera la fonction actuelle avec une nouvelle entrée. https://code.kx.com/q/ref/dotz/#zs-self


0 commentaires

1
votes

En plus de la réponse de @ CWD, vous pouvez le faire avec une récursivité explicite en utilisant .zs comme ceci:

func: {[x;f;threshold] $[threshold <= count x;x;.z.s [x,enlist f last x;f;threshold]]}
func[1 2 3;{x*10};5} /returns 1 2 3 30 300

Cela appliquera récursivement votre fonction au dernier élément jusqu'à ce que le nombre total de la liste atteigne votre seuil spécifié. Bien sûr, définissez le seuil trop haut et vous vous retrouverez avec une erreur de stack . En tant que tel, il est préférable d'utiliser les itérateurs standard dans le code de production.


0 commentaires