x871kx6167ss7 Skrevet 4. januar 2009 Del Skrevet 4. januar 2009 (endret) Hei, har et spørsmål, men ikke et problem lenger. Jeg har lagd en enkel kø. Og den ville ikke slette siste elementet i køen. Jeg lagrer pekerene til første og siste element i køen i et pair. Dersom jeg skal slette første element og pekerne til første og siste element er like, så skrev jeg over pairet med (cond '() '()), altså sånn en tom kø. Koden ser sånn her ut: (define (make-queue) (let ((data (cons '() '()))) (lambda (proc) (proc data)))) (define (remove-queue-item! queue) (queue (lambda (data) (cond ((eq? (car data) (cdr data)) (set! data (cons '() '()))) (else (set-car! data (cdr (car data)))))))) Dette fungerte ikke, siden den ikke ville slette det siste elementet. Så jeg endret til: (define (remove-queue-item! queue) (queue (lambda (data) (cond ((eq? (car data) (cdr data)) (set-car! data '()) (set-cdr! data '())) (else (set-car! data (cdr (car data)))))))) Og det fungerte helt fint. Kan noen fortelle meg hvorfor dette fungerer annerledes? Hvorfor fungerte det ikke å overskrive køen? Nå ser jeg jo at løsningen ikke er så bra, siden den feiler dersom man legger samme objekt inn to ganger, men uansett... (Endret skjekken til (null? (cdr (car data)))). Takker for svar. Hele koden: Klikk for å se/fjerne innholdet nedenfor (define (make-queue) (let ((data (cons '() '()))) (lambda (proc) (proc data)))) (define (empty-queue? queue) (queue (lambda (data) (null? (car data))))) (define (add-to-queue! obj queue) (queue (lambda (data) (let ((new-item (cons obj '()))) (cond ((null? (car data)) (set-car! data new-item) (set-cdr! data new-item)) (else (set-cdr! (cdr data) new-item) (set-cdr! data new-item))))))) (define (first-queue-item queue) (queue (lambda (data) (car data)))) (define (remove-queue-item! queue) (queue (lambda (data) (cond ((eq? (car data) (cdr data)) (set-car! data '()) (set-cdr! data '())) (else (set-car! data (cdr (car data)))))))) Endret 4. januar 2009 av Blackslash Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå