#lang R5RS ; Пример за функция от по-висок ред, пресмятаща определен интеграл (define (integral f a b) (let ((h 0.00001)) (if (>= a b) 0 (+ (* h (f (+ a (/ h 2)))) (integral f (+ a h) b)) ) ) ) (define (id x) x) (define (sq x) (* x x)) (define (f x) 2) (define (acc-ln first next-fn start acc-fun cond) (define (acc n cur sum) (if (cond cur n) sum (acc (+ n 1) (next-fn cur n) (acc-fun cur sum)) ) ) (acc 1 first start) ) (define (next-fact cur n) (/ cur n)) (define (inc x n) (+ x 1)) (define (dec x n) (- x 1)) (define (cond-100 cur n) (> n 100)) ; Сума на числата от 1 до 100 (define (sum-nmb n) (define (cnd c x) (> x n)) (acc-ln 1 inc 0 + cond-100)) ; Факториел (define (fact n) (let ((up n)) (define (cond-up cur n) (> n up)) (acc-ln 1 inc 1 * cond-up) ) ) ; E (define (e) (define (cnd c n) (< c 0.0001)) (acc-ln 1 next-fact 0.0 + cnd)) ; Е^X (define (ex x) (define (next-fun cur n) (* (/ cur n) x)) (acc-ln 1 next-fun 0.0 + cond-100) ) ;--------------------------------------- ;Работа със списъци... ; Създава списък от B до A (define (make-list a b) (define (OK? a n) (> a b)) (reverse (acc-ln a inc '() cons OK?)) ) ; Дължина на списък (define (len l) (if (null? l) 0 (+ 1 (len (cdr l))) ) ) ; Дължина с използването на горния акумулатор (define (len-acc l) (define (inc l x) (+ x 1)) (define (ok? l n) (null? l)) (define (cdr-n l n) (cdr l)) (acc-ln l cdr-n 0 inc ok?)) ; Обръща списък (define (rev l) (define (rev-acc l res) (if (null? l) res (rev-acc (cdr l) (cons (car l) res)) ) ) (rev-acc l '()) ) ; Препендва елемент към списък ;) (define prepend cons) ; TODO: Чрез акумулатора намира броя на простите числа в интервал ; TODO: Чрез акумулатора намира сумата от делителите на число ; TODO: Чрез горната и акумулатора (още един път) намира в списък първите 3 съвършени числа ; TODO: Взима първите N елемента от списък ; TODO: Взима последните N елемента на списък ; TODO: Апендва елемент към списък ; TODO: Апендва два списъка ; TODO: Вмъква елемент на дадена позиция в списък ; TODO: Проверява дали елемент се съдържа в списък