2016-03-28 6 views
-2

Ich weiß, wie die ersten n Elemente in einer Liste zu bekommen,Erhalten letzten n Elemente in einer Liste in DrRacket, ohne list-ref

(define (countup n ls) 
    (cond 
    [(zero? n) '()] 
    [else (cons (first ls) (countup (sub1 n) (rest ls)))])) 

aber wie kann ich so etwas tun für die letztenn Elemente in einer Liste (ohne List-Ref)? Wenn Sie (countup 3 '(a b c d e)) anrufen, bekomme ich (list a b c). Ich muss in der Lage sein, (counter 3 '(a b c d e)) einzugeben und (list c d e) zu erhalten.

Ich brauche Fehlermeldungen, falls die angegebene Nummer n größer ist als die Listenlänge.

Antwort

2

Verwenden Sie einfach das eingebaute in take-right Verfahren, es tut genau das, was Sie brauchen:

(take-right '(a b c d e) 3) 
=> '(c d e) 

Oder man kann es von Grund auf neu implementieren, mit primitiven Prozeduren:

(define (counter n lst) 
    (define (move n lst) 
    (if (zero? n) 
     lst 
     (move (sub1 n) (rest lst)))) 
    (define (trim-left lst rst) 
    (if (empty? rst) 
     lst 
     (trim-left (rest lst) (rest rst)))) 
    (trim-left lst (move n lst))) 

Es funktioniert auch als erwartet:

(counter 3 '(a b c d e)) 
=> '(c d e) 
+0

Ich muss in der Lage sein, es ohne Take-Right zu tun – KrissyMichaelsson

+0

altho ich Danke, dass du versuchst zu helfen, ich kann nicht trimmen, nehmen, bewegen oder referenzieren. – KrissyMichaelsson

+0

Ich benutze keine von denen, ich habe einfach zwei Hilfsprozeduren definiert, die zufällig 'move' und' trim-left' heißen. Es ist in Ordnung, zusätzliche Helfer zu benutzen, Sie können dieses Problem nicht ohne sie lösen. –

Verwandte Themen