Manipulation de la matrice dans la raquette

Nov 24 2020

J'ai besoin d'écrire une fonction qui produit la nième colonne d'une matrice dans Racket sans utiliser la récursivité. Par exemple, (list (list 1 2 3) (list 2 3 4) (list 6 7 9))si je voulais la 2e colonne, je recevrais (list 2 3 7).

J'ai essayé (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), mais cela continue de me montrer une erreur.

Réponses

adabsurdum Nov 24 2020 at 09:32

La solution tentée utilise list-refdeux fois, ce qui n'est pas nécessaire, et l'un de ces appels n'a pas assez d'arguments: (list-ref M)la fonction ne prend qu'un seul argument, mais elle nécessite deux arguments - une liste et un entier.

La list-reffonction retournera un élément indexé à partir d'une liste d'entrée, donc (list-ref '(1 2 3) 1)retournera 2. Considérez ce qui mapva faire ici: la matrice est représentée comme une liste de listes (une liste de lignes), c'est-à-dire comme ((1 2 3) (2 3 4) (6 7 9)). La mapfonction d' agir sur les membres de la liste d'entrée, qui sont les listes (1 2 3), (2 3 4)et (6 7 9). En mapenvoyant un ping à la list-reffonction sur cette entrée, vous pouvez prendre l'élément de votre choix dans les sous-listes. Donc, (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))évaluerait (2 3 7), comme souhaité.

Voici une fonction qui vous permet de prendre n'importe quelle colonne d'une matrice:

(define (nth-column M n)
  (map (lambda (row) (list-ref row n)) M))

Exemples d'interactions:

scratch.rkt> (define M '((1 2 3)
                         (2 3 4)
                         (6 7 9)))
scratch.rkt> (nth-column M 1)
'(2 3 7)
scratch.rkt> (nth-column M 0)
'(1 2 6)
scratch.rkt> (nth-column M 2)
'(3 4 9)