Zdravím, nemá někdo z Vás tady nějáké zkušenosti s programovacím jazykem Scheme?
Mám udělat projekt do školy, nicméně mi dělá pochopení tohoto jazyka problém (např. si němůžu zvyknout na prefixovou notaci)... a mnou naprogramované procedury pak nedělají to, co po nich chcu :( ocením každou pomoc, takže pokud někdo ví, jak se v tomhle dělá, ať čeká, že se na něj obrátím o pomoc :)
Abych uvedl příklad, máme naprogramovat predikát, který jako argument bere seznam a vrací true v případě, že je seznam liché délky (neboli má lichý počet členů - případně je prázdný) a zároveň jsou členy na sudých pozicích stejné.
Konkrétně (predikát se jmenuje interlaced?):
(interlaced? '(1 x 2 x 3)) --> true
(interlaced? '(x 1 x 2 x)) --> false
Já jsem docílil toho, že mi to vrátí true v případě, že je seznam prázdný a že mi to vrátí false když je sudé délky... nevím ale, jak tam přidat tu podmínku na porovnávání sudých členů... tuším, že v C/C++ bych věděl jak na to, ale tady jsem fakt mimo :( ...
kód, co jsem napsal (možná trochu nepřehledně)?
(define interlaced?
(lambda (seznam)
(cond ((null? seznam) #t)
((= (modulo (length seznam) 2) 0) #f)
((and (= (modulo (length seznam) 2) 1)))
Tenhle predikát má kontrolovat, že seznam mohl vzniknout funkcí interlace, kterou jsem naprogramoval předtím (a ta mi funguje):
(define interlace
(lambda (seznam prvek)
(let ((delka (length seznam))
(delka_2 (+ (length seznam) (- (length seznam) 1))))
(build-list delka_2
(lambda (i)
(cond ((= i 0) (list-ref seznam 0))
((= (modulo i 2) 1) prvek)
((= (modulo i 2) 0) (list-ref seznam (/ i 2)))))))))
Tahle fce bere dva argumenty: seznam a element. Úkolem je, aby procedura interlace vracela původní seznam, ale s tím, že za každý prvek seznamu se umístí element.
Poradí mi někdo?
Díky Bziba