#lang racket ;; -------------------------------------------------- ;; Cursul al II-lea: ;; ;; Reducerea listelor. Funcționalele foldl/foldr. ;; Trei probleme: ;; 1. suma unei liste ;; 2. maximul unei liste ;; 3. multiplii lui trei dintr-o listă (define sum-list (λ (lst) (if (null? lst) 0 (+ (car lst) (sum-list (cdr lst)))))) (define (max-list l) (cond ((null? (cdr l)) (car l)) ((> (car l) (max-list (cdr l))) (car l)) (else (max-list (cdr l))))) (define (unique-helper l acc) (cond ((null? l) (car acc)) ((member (car l) (cdr acc)) (unique-helper (cdr l) acc)) (else (unique-helper (cdr l) `(,(add1 (car acc)) . (,(car l) . ,(cdr acc))))))) (define (unique l) (unique-helper l '(0))) ;; fold-right => natural pe stivă (define (fold-right f default l) (if (null? l) default (f (car l) (fold-right f default (cdr l))) )) (define (sum-list-right l) (fold-right (λ (x y) (+ x y)) 0 l)) (define (unique-list-right l) (car (fold-right (λ (e set) (if (member e (cdr set)) set (cons (add1 (car set)) (cons e (cdr set))))) '(0) l))) ;; fold-left => natural pe coadă (define (fold-left f acc l) (if (null? l) acc (fold-left f (f (car l) acc) (cdr l)) )) (define (sum-list-left l) (fold-right (λ (x y) (+ x y)) 0 l)) (define (unique-list-left l) (car (fold-left (λ (e set) (if (member e (cdr set)) set (cons (add1 (car set)) (cons e (cdr set))))) '(0) l)))