-
Дефинирайте процедура
(compose . fns)
, която връща композицията на подадените едноаргументни процедуриfns
.(define (double x) (* 2 x)) (define (square x) (* x x)) (define (inc x) (+ x 1)) (define f (compose double square inc)) ; 2 * (x + 1)^2 (f 3) ; -> 32 (f 4) ; -> 50
-
Дефинирайте процедура
(flip fn)
, която обръща реда на аргументите на процедуратаfn
независимо от броя им.(define list^ (flip list)) (list^ 1 2 3) ; -> (3 2 1)
-
Дефинирайте процедура
(zip x y)
, която връща списък от наредени двойки ((x1 y1) (x2 y2) ... (xn yn)), където xi и yi са съответно i-тият елемент на списъкаx
и i-тият елемент на списъкаy
, аn
е дължината на по-късия списък отx
иy
.(zip '(1 3 5) '(2 4 6)) ; -> ((1 2) (3 4) (5 6)) (zip '(1 3 5) '(2 4 6 8)) ; -> ((1 2) (3 4) (5 6))
Дефинирайте процедура
(zip-with fn x y)
, която връща списъка (fn(x1, y1) fn(x2, y2) ... fn(xn, yn)), където xi и yi са съответно i-тият елемент на списъкаx
и i-тият елемент на списъкаy
, аn
е дължината на по-късия списък отx
иy
.(zip-with + '(1 3 5) '(2 4 6)) ; -> (3 7 11) (zip-with + '(1 3 5) '(2 4 6 8)) ; -> (3 7 11)
Дефинирайте по-общ вариант на процедурата
zip-with
-(zip-with* fn . ls)
, която прилагаfn
с аргументи поредните елементи на списъцитеls
, докато някой от тях не се изчерпа.(zip-with* + '(1 2 3) '(4 5 6) '(7 8 9)) ; -> (12 15 18) (zip-with* cons '(1 3 5) '(2 4 6 8 10)) ; -> ((1 . 2) (3 . 4) (5 . 6))
-
Дефинирайте процедура
(juxt . fns)
(от англ. juxtaposition - съпоставяне). Резултатът от(juxt f g h ...)
e процедура с променлив брой аргументи, която връща списък с резултатите от прилагането на всяка една от процедуритеf
,g
,h
, ... върху тези аргументи.(define (inc x) (+ x 1)) (define (dec x) (- x 1)) (define (square x) (* x x)) (define (double x) (* 2 x)) (define f (juxt inc dec square double)) ; (f x) = (list (inc x) (dec x) (square x) (double x)) (f 5) ; -> (6 4 25 10) (define g (juxt + *)) (g 3 4 5) ; -> (12 60)
-
Дефинирайте процедура
(dimensions matrix)
, която връща наредена двойка с броя редове и броя колони на матрицатаmatrix
.(dimensions '((1 2 3) (4 5 6))) ; -> (2 . 3)
-
Дефинирайте процедура
(reverse-columns matrix)
, която обръща реда на колоните в матрицатаmatrix
.(reverse-columns '((1 2 3) (4 5 6) (7 8 9))) ; -> ((3 2 1) (6 5 4) (9 8 7))
-
Дефинирайте процедура
(nth-column matrix n)
, която връща списък с елементите наn
-тата поред колона от матрицатаmatrix
.(nth-column '((1 2 3) (4 5 6) (7 8 9)) 1) ; -> (2 5 8)
-
Дефинирайте процедура
(main-diagonal matrix)
, която връща списък с елементите в главния диагонал на матрицатаmatrix
.(main-diagonal '((1 2 3) (4 5 6) (7 8 9))) ; -> (1 5 9)
-
Дефинирайте процедура
(transpose matrix)
, която връща транспонираната матрица на матрицатаmatrix
.(transpose '((1 2 3) (4 5 6))) ; -> ((1 4) (2 5) (3 6))
-
Дефинирайте процедура
(for-all-columns? p matrix)
, която проверява дали за всяка колона в матрицатаmatrix
е изпълнен предикатътp
. -
Дефинирайте процедура
(prime-in-each-column? matrix)
, която проверява дали във всяка колона в матрицатаmatrix
има просто число.(prime-in-each-column? '((1 2 3) (4 5 6) (42 8 9))) ; -> #f (prime-in-each-column? '((17 2 16) (4 5 3))) ; -> #t
-
Дефинирайте процедура
(multiply a b)
, която връща произведението на двете матрициa
иb
. -
Дефинирайте процедура
(count-columns matrix)
, която намира броя на колоните на матрицатаmatrix
, за които е вярно, че всичките им елементи се срещат в някой от редовете на матрицатаmatrix
.Например
(count-columns '((1 4 3) (4 5 6) (7 4 9)))
връща1
, защото4
,5
и4
от втората колона се срещат във втория ред.
За решаването на задачите използвайте основните процедури за работа с двоични дървета, дефинирани в binary-tree.scm.
-
Дефинирайте процедури
(pre-order tree)
,(in-order tree)
и(post-order tree)
, които правят съответно корен-ляво-дясно, ляво-корен-дясно и ляво-дясно-корен обхождане на двоичното дървотоtree
. Процедурите да връщат списък от върховете наtree
в реда на тяхното обхождане. -
Ниво
n
в двоично дърво наричаме списък от всички върхове на двоичното дърво, които са на разстояниеn
от корена. Ниво0
съдържа само корена на дървото. Дефинирайте процедура(level n tree)
, която връщаn
-тото ниво в двоичното дървоtree
. -
Дефинирайте процедура
(count-leaves tree)
, която намира броя на листата в двоичното дървоtree
. -
Дефинирайте процедура
(map-tree fn tree)
, която прилага процедуратаfn
върху всеки връх на двоичното дървоtree
. -
Двоична пирамида е:
- празното двоично дърво или
- двоично дърво, в което всеки връх е по-малък от децата си.
Да се напише процедура
(binary-heap? tree)
, която проверява дали двоичното дървоtree
е двоична пирамида. -
Двоично дърво е балансирано, ако:
- е празното двоично дърво или
- височините на лявото и дясното поддърво се различават най-много с 1 и лявото и дясното поддървета са балансирани.
Да се напише процедура
(balanced? tree)
, която проверява дали двоичното дървоtree
е балансирано.