2016-11-16 9 views
0

Je suis nouveau à Racket, et j'essaie de comprendre tri d'insertion. C'est ce que j'ai, mais je reçois une erreur, et je n'arrive pas à la comprendre à partir du débogage.Sort d'insertion dans la raquette, ne peut pas comprendre pourquoi cela ne fonctionne pas

;Definition of insert: inserts a number into an already sorted list based on 
;the cmp parameter 
;cmp: <or>, L1: a list, n: the number to be inserted 
(define (insert cmp L1 n) 
    (cond 
    ((null? n) (list L1)) 
    ((null? L1) (cons n L1)) 
    ((cmp n (car L1)) (cons n L1)) 
    (else (cons (car L1) (insert cmp (cdr L1) n))) 
    ) 
) 

;Definition of insertionSort: sorts a list based on a recursive insertion sort 
;L1: a list, cmp: <or> 
(define (insertionSort L1 cmp) 
    (cond 
    ((null? L1) L1) 
    (else (insert cmp (car L1) (insertionSort(cdr L1) cmp))) 
) 
) 
+0

Le cas '(null? n)' dans 'insert' n'est pas très utile puisque' n' est un nombre. – molbdnilo

Répondre

0

Les fonctions suivantes fonctionnent:

(define (insert n l cmp (ol '())) 
    (cond 
    [(empty? l) 
    (append ol (list n))] ; or: (reverse (cons n (reverse ol))) 
    [(not (cmp n (first l))) 
    (append ol (list n) l)] 
    [else (insert n 
        (rest l) 
        cmp 
        (append ol (list (first l))) ; or: (reverse (cons (first l) (reverse ol))) 
       )])) 

(define (isort l cmp (sl '())) 
    (cond 
    [(empty? l) sl] 
    [else (isort (rest l) 
       cmp 
       (insert (first l) 
         sl 
         cmp))])) 

Ces fonctions semblent être récursive.

Test:

(isort '(4 2 5 8 1 4 7 3 6 9) >) 
(isort '(4 2 5 8 1 4 7 3 6 9) <) 

Sortie:

'(1 2 3 4 4 5 6 7 8 9) 
'(9 8 7 6 5 4 4 3 2 1) 
0

Vous avez "renversé" les arguments pour insert lorsque vous l'utilisez dans insertionSort; il devrait être

(define (insertionSort L1 cmp) 
    (cond 
    ((null? L1) L1) 
    (else (insert cmp (insertionSort (cdr L1) cmp) (car L1)))))