En répondant à votre dernier point sur "comment ai-je besoin de changer ma mentalité, pour programmer correctement en q?« :.
Vous devez utiliser sur (/), scan (\) et .zs plutôt que d'utiliser des boucles
Par exemple, votre problème pourrait être résolu de la manière suivante: (notez que celles-ci pas vraiment être les meilleures solutions pour votre problème particulier - l'indexation est la meilleure approche là - mais ces solutions ci-dessous devrait néanmoins aider à obtenir le point à travers)
price:18.54 18.53 18.53 18.52 18.57 18.9 18.9 18.77 18.59 18.51 18.37
q)3#'{1_x}\[8;price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37
c.-à-itérer sur la liste, hacher un hors chaque fois, prendre 3 premiers de chaque itération
ou similaire
q)3#'{1 rotate x}\[8;price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37
-à-dire en rotation par 1 huit fois, prendre la première 3 de chaque rotation
En utilisant une approche .zs
q){$[2<count x;enlist[3#x],.z.s 1_x;()]}[price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37
-à-dire s'il existe au moins 3 éléments à gauche, prenez d'abord 3, puis coupez le premier article et réappliquez la même fonction à la liste abrégée.
En utilisant plus (/) serait alambiqué dans cet exemple, mais en général plus est usful pour remplacer "tandis que" le type construit
i:0
a:0;
while[i<10;i+:1;a+:10]
est mieux réalisé en utilisant
q){x+10}/[10;0]
100
-à-dire ajouter 10, dix fois avec une valeur de départ (graine) de zéro. Par exemple, vous pouvez ajouter des nombres aléatoires entre 1 et 20 jusqu'à ce que vous atteigniez 18, puis arrêtez-vous.
est mieux réalisé en utilisant
q){x,1?20}/[{not 18~last x};()]
1 2 16 5 8 18
-à-dire ajouter un nombre aléatoire entre 1 et 20, itérer tant que la fonction de contrôle renvoie true, à commencer par() comme valeur de départ
Il y a beaucoup de d'autres options pour utiliser scan et over, selon que la fonction que vous itérez est monadique/diadique, etc.
En général: une boucle de type "pour i = 1: 10" peut être obtenue en q en utilisant "fonction chaque i", une boucle de type "do" peut être obtenue en q en utilisant des "fonctions/[numOfTimes; graines]" une boucle "while" de type peut être obtenue en q en utilisant "fonction/[booleanCheckFunction; graines]"
Il n'est pas vrai que q n'a pas de boucles, c'est juste que vous êtes découragé de les utiliser sauf si vous en avez vraiment besoin. c'est la bonne chose à faire, et pour cela, vous voudriez vérifier les mots-clés 'while' et' do'. – mollmerx