Základom môže byť všeobecná schéma spracovania na ľubovolnej úrovni.

Vždy zisťujem maximálne číslo z s-výrazu vľavo (first) a vpravo (rest) a vyberám maximum. Jedným z možných riešení je, že v našej hlavnej funkcií použijeme funkciu mymax, vracajúcu maximálne číslo spomedzi 2 argumentov. Pričom medzi argumentmi môžu byť aj iné prvky ako len čísla. Ak nebude mať na vstupe žiadne číslo môže vrátiť napríklad NIL. To zabezpečí korektné fungovanie aj v prípade, že v podvýraze s-výrazu nebude žiadne číslo.


(defun mymax (a b)
 (cond ((AND (NUMBERP a) (NUMBERP b)) (max a b))
       ((NUMBERP a) a)
       ((NUMBERP b) b)
       (T NIL)
 )
)


; V hlavnej funkcií maxc v cond za (ATOM sv) nemôžem 
; vracať 0, pretože ak by v zozname bolo
; napr. maximálne číslo -1, potom by sa miesto neho zobrala táto
; nula, ktorá vlastne v zozname ako číslo nie je.

(defun maxc (sv)
 (cond ((NUMBERP sv) sv)
       ((ATOM sv) NIL)
       (T (mymax (maxc (first sv)) (maxc (rest sv))))
 )
)

; Príklady:
(maxc '(1 2 (3 4 (5 6)) 5))  ; -> 6
(maxc '(-8 (-9 -10) ((-1)))) ; -> -1

 


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