; За тези решения използвам реализациите на accumulate ; от упражнения. Разликата с реализациите от лекции ; е само в последователността на аргументите - идейно ; са едни и същи. (define (accum-iter op null-value term a next b) (define (helper curr result) (if (> curr b) result (helper (next curr) (op (term curr) result)))) (helper a null-value)) (define (filter-iter pred? op null-value term a next b) (define (helper curr result) (cond [(> curr b) result] [(pred? curr) (helper (next curr) (op (term curr) result))] [else (helper (next curr) result)])) (helper a null-value)) (define (id x) x) (define (++ x) (+ x 1)) ;----------------------------------------------------- ; Зад.1 (define (squares-product a b) (filter-iter (lambda (i) (integer? (sqrt i))) * 1 id a ++ b)) ; Бонус решение за първата задача, много по-добро от "наивното". ; Предадено от студент и малко доработено от мен (let-овете). ; Разликата между двете може да се усети със следните примери: ; (= (squares-product 1 10000000) 0) и ; (= (squares-product* 1 10000000) 0). ; p.s. числата са с 20000 цифри, затова не ги принтираме - не че е проблем. (define (squares-product* a b) (let [(sq_a (if (negative? a) 0 (inexact->exact (ceiling (sqrt a))))) (sq_b (if (negative? a) 0 (inexact->exact (floor (sqrt b)))))] (accum-iter * 1 (lambda (i) (* i i)) sq_a ++ sq_b))) ; Зад.2 (define (sum-row x n) (accum-iter + 0 (lambda (i) (expt x (expt 2 i))) 0 ++ (- n 1))) ; Зад.3 (define (const? f a b) (define (term i) (equal? (f i) (f a))) (define (&& p q) (and p q)) (accum-iter && #t term a ++ b)) ; Бонус (define (max-fun f a b) (accum-iter max -inf.0 f a ++ b))