Mallivastauksia koetehtäviin


;; 1.a

(define (sq-diff x y)
  (let ((d (- x y)))
    (* d d)))

;; 1. tapa: luodaan mapilla erotusten lista ja annetaan se kaikki kerralla
;; +-proseduurille

(define (sum-sq-diff/list xs ys)
  (apply + (map sq-diff xs ys)))

;; 2. tapa: tavanomainen rekursiivinen ratkaisu
(define (sum-sq-diff/list xs ys)
  (if (or (null? xs) (null? ys))
      0
      (+ (sq-diff (car xs) (car ys))
         (sum-sq-diff/list-2 (cdr xs) (cdr ys)))))

;; 3. tapa: iteratiivinen ratkaisu
(define (sum-sq-diff/list xs ys)
  (define (aux xs ys acc)
    (if (or (null? xs) (null? ys))
        acc
        (aux (cdr xs) (cdr ys) (+ acc (sq-diff (car xs) (car ys))))))
  (aux xs ys 0))


;; 1.b

;; 1. tapa: muutetaan vektori listaksi ja käytetään valmista proseduuria
(define (sum-sq-diff/vector xs ys)
  (sum-sq-diff/list (vector->list xs) (vector->list ys)))

;; 2. tapa: tavanomainen läpikäynti

(define (sum-sq-diff/vector xs ys)
  (define (aux i sum)
    (if (= i (vector-length xs))
        sum
        (aux (+ i 1) (+ sum (sq-diff (vector-ref xs i) (vector-ref ys i))))))
  (aux 0 0))


;; 2.a

;; tutkitaan alusta, ei lopusta

(define (rmeet xs ys acc)
  (if (or (null? xs) 
          (null? ys) 
          (not (equal? (car xs) (car ys))))
      acc
      (rmeet (cdr xs) (cdr ys) (cons (car xs) acc))))

(define (meet xs ys)
  (rmeet (reverse xs) (reverse ys) '()))

;; 2.b

;; 1. tapa: on helpompi laskea alusta kuin lopusta, siispä käännetään.

(define (head? xs ys)
  (or (null? xs)
      (and (not (null? ys))
           (equal? (car xs) (car ys))
           (head? (cdr xs) (cdr ys)))))

(define (tail? xs ys)
  (head? (reverse xs) (reverse ys)))


;; 2.tapa: tasoitetaan listat samanpituisiksi ja verrataan

(define (tail? xs ys)
  (let ((xl (length xs))
        (yl (length ys)))
    (and (>= yl xl)
         (equal? xs (list-tail ys (- yl xl))))))
      
;; 3.tapa: käytetään meet:iä

(define (tail? xs ys)
  (equal? (meet xs ys) xs))
Lauri Alanko