2016-04-13 12 views
0

Ich möchte einen Schema-Vektor mit den Dimensionen n^{2} durch n^{2} erstellen (also wenn n = 4 ist dies eine 16 mal 16 Matrix, wenn n = 5 ist eine 25 um 25-Matrix), wobei jedes Element eine ganze Zahl durch den folgenden (den Wert des Elements muss immer zwischen 1 und n * n)verschachtelte Schleifen mit Akkumulation in Schema

x=0 
for i=0 to n-1 
    for j=0 to n-1 
    for k=0 to n*n-1 
     vector[n(i - 1) + j + k]= x (mod n*n)+ 1 
     x = x+1 
    x= x + n 
    x=x+1 

ich begann nach unten dem folgenden Pfad, aber ich bin nicht gegeben ist sicher, wie die x-Akkumulation in Schema

(define (generate-vector n) 
    (define w (* n n)) 
    (for*/vector ([row (in-range n)] 
       [col (in-range n)] 
       [k (in-range w)]) 
       ; TO DO)) 
+1

Was ist das Ergebnis von '(generate-vector 3)'? Die Aussage 'vector [n (i - 1) + j] [k] = ...' legt nahe, dass Vektor ein Array und kein Vektor ist. Möchten Sie einen großen Vektor mit der Länge 'n * n' oder einen Vektorenvektor erzeugen? – soegaard

+0

Auch in Ihrem Pseudo-Code: basieren die Vektor-Indizes 0 oder 1? – soegaard

+0

Die Vektorindizes basieren auf 0. Ich reparierte den Pseudocode – JennyToy

Antwort

1

zu tun, wenn ich richtig verstanden habe, wollen Sie einen n x n Vektor, wobei jedes Element eine andere i nteger ab 1. Versuchen Sie folgendes:

(define (generate-vector n) 
    (for/vector ([i (in-range n)]) 
    (build-vector n (lambda (j) (+ (* n i) j 1))))) 

Zum Beispiel:

(generate-vector 3) 
=> '#(#(1 2 3) #(4 5 6) #(7 8 9)) 
+0

sollte ' # (1 2 3 4 5 6 7 8 9 1 2 3 ...). Alle Ganzzahlen. Aber Ihr Code ist sehr nahe. – JennyToy

+1

@JennyToy Ich bekomme immer noch nicht, was Sie wollen, als Ausgabe.Es ist ein Vektor von Vektoren (eine "Matrix") oder ein eindimensionaler Vektor? Und warum wiederholt es sich nach dem 9. Wert? Bitte definieren Sie _clearly_, für einen Wert von 'n' geben Sie die _exact_ Ausgabe an, die Sie benötigen. –

+0

@JennyToy Mit anderen Worten: Schreiben Sie eine Beispieleingabe mit der erwarteten Ausgabe als Teil der Frage, tun Sie dies immer für Ihre Fragen, es ist einfacher als zu versuchen, Leuten zu erklären, was Sie mit Pseudocode machen wollen –

1

Hier eine fast wörtliche Übersetzung des Pseudo-Code ist:

(define (generate-vector n) 
    (define n^2 (* n n)) 
    (define v (make-vector n^2)) 
    (define x 0) 
    (for ([i n]) 
    (for ([j n]) 
     (for ([k n^2]) 
     (vector-set! v (+ (* n i) j) (+ (modulo x n^2) 1)) 
     (set! x (+ x 1))) 
     (set! x (+ x n))) 
    (set! x (+ x 1))) 
    v) 

(generate-vector 3) 

Anmerkung 1: (- i 1)-i geändert wurde (sonst Sie erhalten Sie negative Indizes, wenn i=0.

Hinweis 2: I weggelassen +k, da dies zu Indizes zu groß führt.

1

Basierend auf Ihre Kommentare und nicht die ursprüngliche Frage, ich glaube, Sie nach so etwas wie dies könnte suchen:

(define generate-vector 
    (lambda (n) 
    (let ((template (iota (* n n) 1))) 
     (let loop ((todo template) 
       (done '()) 
       (result template)) 
     (if (= 1 (length todo)) 
      (list->vector result) 
      (let* ((head (car todo)) 
        (tail (cdr todo)) 
        (next (append done (list head)))) 
       (loop tail 
        next 
        (append result tail next)))))))) 

iota von SRFI-1 definiert ist.

Verwandte Themen