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?
3 Réponses :
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
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
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.