;Zaimplementowa i przetestowa funkcj:

;1. obliczajc dugo listy
(define (dl list)
  (if (null? list) 
      0
      (+ 1 (dl (cdr list)))
      )
  )
(display "(dl '(1 2 4)) => 3,\n");
(dl '(1 2 3))

;2. obliczającą sumę elementów na liście 
(define (suma list)
  (if (null? list)
      0
      (+ (car list) (suma (cdr list)))
      ))
(display "\n(suma '(1 2 4)) => 7,\n")
(suma '(1 2 4))

;3. obliczającą iloczyn elementów na liście 

(define (iloczyn list)
  (if (null? list) 
      1
      (* (car list) (iloczyn (cdr list)))
      ))
(display "\n(iloczyn '(1 2 4)) => 8,\n")
(iloczyn '(1 2 4))

;4. obliczającą iloczyn skalarny dwóch list 
(define (il-skal list1 list2)
  (if (null? list1)
      0
      ( + (* (car list1) (car list2)) (il-skal (cdr list1) (cdr list2)))
      ))

(display "\n(il-skal '(1 2 3) '(1 2 3)) => 14\n")
(il-skal '(1 2 3) '(1 2 3))


;5. obliczającą liczbę elementów na liście spełniających predykat 

(define (count_if list pred)
  (cond 
    ((null? list) 0)
    ((pred (car list)) (+ 1 (count_if (cdr list) pred)))
    (else
     (count_if (cdr list) pred))
    ))

(display "\n(count_if '(3 5 2) odd?) => 2,\n")
(count_if '(3 5 2) odd?)


;6. obliczającą liczbę elementów o określonej wartości w liście

(define (count_elem list arg)
  (cond 
    ((null? list) 0)
    ((= (car list) arg) (+ 1 (count_elem (cdr list) arg)))
    (else
     (count_elem (cdr list) arg))
    ))
(display "\n(count_elem '(1 1 2 3 1) 1) => 3,\n")
(count_elem '(1 1 2 3 1) 1)

;7. przyjmującą listę i predykat, elementy, które spełniają ten predykat powinny być 
;przekopiowane do listy wynikowej

(define (copy_if list pred)
  (cond
    ((null? list) '())
    ((pred (car list)) (cons (car list) (copy_if (cdr list) pred)))
    (else
     (copy_if (cdr list) pred))))

(display "\n(copy_if '(1 2 3 4 5) odd?) => (1 3 5),\n")
(copy_if '(1 2 3 4 5) odd?)

;8. tworzącą listę, której elementy są kolejnymi sumami elementów dwóch list

(define (suma-list list1 list2)
  (if (null? list1) 
      '()
      (cons (+ (car list1) (car list2)) (suma-list (cdr list1) (cdr list2)))
      ))
     
(display "\n(suma-list '(1 2 3) '(1 2 3)) => (2 4 6),\n")
(suma-list '(1 2 3) '(1 2 3))


;9. tworzącą listę zawierającą n określonych parametrem liczb
(define (wypelnij czym ile)
  (if (= 0 ile)
      '()
      (cons czym (wypelnij czym (- ile 1)))
      ))
(display "\n(wypelnij 10 3) => (10 10 10),\n")
(wypelnij 10 3)

;10. znajdującą maksymalny element na liście
(define (maksymalna lista)
  (define (pomocnicza wstepny lista1)
    (cond 
      ((null? lista1) wstepny)
      ((> (car lista1) wstepny) (pomocnicza (car lista1) (cdr lista1)))
      (else
       (pomocnicza wstepny (cdr lista1))
       )))
  (pomocnicza (car lista) (cdr lista)))
(display "\n(maksymalna '(4 2 10 1)) => 10,\n")
(maksymalna '(4 2 10 10))

;11. znajdującą i zwracającą pierwszy element spełniający predykat
(define (pierwszy list pred)
  (cond
    ((null? list) '())
    ((pred (car list)) (car list))
    (else
     (pierwszy (cdr list) pred))
    ))
(display "\n(pierwszy '(4 6 8 3 3) odd?) => 3,\n")
(pierwszy '(4 6 8 3 3) odd?)

;12. tworzącą listę zawierającą elementy z listy docelowej zmodyfikowane przekazywaną jako 
;drugi parametr funkcją 

(define (mapa list pred)
  (if (null? list) '()
      (cons (pred (car list)) (mapa (cdr list) pred))
      ))
(display "\n(mapa '(4 16 36) sqrt) => (2 4 6)\n")
(mapa '(4 16 36) sqrt)

© Wklejaj.pl