Упражнение №9 - Потоци
За работа с потоци на езиците R5RS и Pretty Big можете да използвате наготово следния интерфейс:
(define-syntax cons-streamТук [1 2 3 ... ] е символично представяне на безкраен поток - такъв тип "литерали" за потоци в Scheme не съществува!
(syntax-rules ()
((cons-stream h t) (cons h (delay t)))))
(define (head str) (car str))
(define (tail str) (force (cdr str)))
Зад.1. Да се напише функция (add-streams str1 str2), която събира почленно два потока.
(add-streams [1 2 3 ... ] [1 2 3 ... ]) -> [2 4 6 ...]
Зад.2. Да се напише функция (map-stream f str), която прилага функцията f над потока str и връща поток от резултатите.
(map (lambda (x) (* x x)) [1 2 3 ...]) -> [1 4 9 ...]
Зад.3. Да се напише функция (take n str), която връща списък от първите n елемента на потока str.
(take 10 fibs) -> (0 1 1 2 3 5 8 13 21 34)
Зад.4. Да се генерира потокът triangs от всички триъгълни числа. Казваме, че n-тото триъгълно число T(n) = 1 + 2 + ... + n.
(take 5 triangs) -> (1 3 6 10 15) ;(Т(1) Т(2) Т(3) Т(4) Т(5))
Зад.5. Да се напише функция (cycle lst), която получава непразен списък от вида (a1 a2 ... an) и връща потока [a1, a2, a3, ..., an, a1, a2, ... ]
(cycle '(1 2 3 4)) -> [1 2 3 4 1 2 3 4 1 2 3 4 ... ]
Зад.6. Да се напише функция (double-cycle lst), която получава непразен списък от вида (a1 a2 ... an) и връща потока [a1, a2, ..., an-1, an, an-1, an-2, ..., a2, a1, a2, ... ]
(double-cycle '(1 2 3 4)) -> [1 2 3 4 3 2 1 2 3 4 3 2 1 2 3 4 ...]
Зад.7. Да се функция (sin-stream x), която връща поток от членовете на реда на Тейлор за функцията sin и числото x.
(sin-stream x) -> [x -x3/3! x5/5! -x7/7! ... ]
Зад.8. Да се напише функция (compose-stream f), която връща потока от функции [id, f, f.f, f.f.f, ... ], където id е функцията-идентитет, а f.g символизира композицията на две функции.
(define str (compose-stream ++))
(map-stream (lambda (f) (f 1)) str) -> [1 2 3 4 5 ... ]
Последно модифициране: сряда, 2 декември 2015, 15:45