2017-04-13 3 views
1

Dieser Code teilt eine Liste in zwei gleich große Listen:Schläger, eine Liste in zwei verschiedenen Größen Listen aufgeteilt

(define (split ls) 
    (if (or (null? ls) (null? (cdr ls))) 
     (list ls '()) 
     (let ((next (split (cddr ls)))) 
     (list (cons (car ls) (car next)) 
       (cons (cadr ls) (cadr next)))))) 

Ich möchte einen Code erstellen (define (split Größe ls)), wobei Größe a hat Wert, zum Beispiel: 0.20, 0.50, 0.63 und es ist die Zahl (in%), die zur ersten Liste gehen wird.

+0

Ist es wichtig, dass die Aufspaltung in einer deterministischen, alternierenden Reihenfolge wie in "Split" erfolgt? Gibt es Anforderungen, wie die Funktion die Zahl rundet, wenn sie nicht exakt erreicht werden kann? –

+0

Nein, es ist nicht wichtig, wie die Zahl gerundet wird, wenn sie nicht genau erreicht werden kann. Nun, da ich das Beispiel habe, die Reihenfolge zu teilen, möchte ich ein anderes Beispiel haben, wo die Elemente zufällig an jede Liste gesendet werden. Die resultierende Liste wird also immer anders sein. –

Antwort

0

Hier ist eine Möglichkeit, es zu tun.

Anstatt die Hilfsfunktion split-at zu verwenden, könnte man Ihre Funktion split verwenden.

#lang racket 

; clamp : number number -> number 
; make sure x is in the interval [a;b], 
; if not return a or b. 
(define (clamp x a b) 
    (max (min x b) a)) 


; split-list : number list -> list list 
; return two values: 
;  - appending the two lists will produce the a list equal to the input list xs 
(define (split-list pct xs) 
    ; find the position to split the list 
    (define pos (exact-round (* (clamp pct 0.0 1.0) (length xs)))) 
    ; split it 
    (split-at xs pos)) 

(split-list 0.00 '(a b c d)) 
(split-list 0.25 '(a b c d)) 
(split-list 0.50 '(a b c d)) 
(split-list 0.75 '(a b c d)) 
(split-list 1.00 '(a b c d)) 
+0

Vielen Dank für den Code. Nun, da ich das Beispiel habe, die Reihenfolge zu teilen, möchte ich ein anderes Beispiel haben, wo die Elemente zufällig an jede Liste gesendet werden. Die resultierenden zwei Listen werden also immer anders sein. Bitte, könnten Sie mir helfen? –

+0

http://docs.racket-lang.org/reference/pairs.html?q=shuffle#%28def._%28%28lib._racket%2Flist..rkt%29._shuffle%29%29 – soegaard

+0

Fantastisch !! ! Danke für die Hilfe! –

Verwandte Themen