Najprv zo zoznamu vyhodíme prvých M-1 prvkov (zoznam prechádzame podobne ako v príklade bezk, len funkciu treba trochu upraviť) a potom na zvyšok zavoláme funkciu ktorá z neho zoberie prvých N-M+1 prvkov (tu možno použiť funkciu z príkladu firstk).


; Prvých k prvkov zoznamu (z prikladu firstk).
; Ak bude k > počet prvkov zoznamu, vráti sa pôvodný zoznam.
; Ak máme zaručené, že k <= počet prvkov zoznamu, môžeme
; prvú vetvu z cond ((null zoz) NIL) vynechať.
; Porovnanie (<= k 0) je pre náš problém 
; všeobecnejšie a robustnejšie ako (= k 0).

(defun firstk (k zoz)
 (cond ((null zoz) NIL)
       ((<= k 0) NIL)
       (T (cons (first zoz) (firstk (- k 1) (rest zoz))))
 )
)


; Vynecháme (m-1) prvkov zoznamu (podobne ako v príklade bezk) 
; a potom na to čo ostane aplikujeme funkciu firstk pre n-m+1 prvkov.

; Ak bude m-1 > počet prvkov zoznamu, vráti sa prázdny zoznam.
; Ak máme zaručené, že m-1 <= počet prvkov zoznamu, môžeme
; prvú vetvu z cond ((null zoz) NIL) vynechať.
; Pre porovnanie m by stačilo (= m 1), ale (<= m 1) je všeobecnejšie
; a pracuje vhodne aj pre záporné čísla, teda pri zápornom k sa
; vráti celý pôvodný zoznam.

; Hlavná funkcia.
(defun postmn (m n zoz)
 (cond ((null zoz) NIL)
       ((<= m 1) (firstk n zoz))
       (T (postmn (- m 1) (- n 1) (rest zoz)))
 )
)

; Príklady:
(postmn 1 5 '(1 2 3 4 5)) ; -> (1 2 3 4 5)
(postmn 0 9 '(1 2 3 4 5)) ; -> (1 2 3 4 5)
(postmn 2 4 '(1 2 3 4 5)) ; -> (2 3 4)
(postmn 3 1 '(1 2 3 4 5)) ; -> NIL

 


Autori[ ZADANIE | AKO ZAČAŤ | RIEŠENIE ]
Posledná aktualizácia 4. 9. 2001
back  home  next