Professional Documents
Culture Documents
Gnjatovic Koncepti Programiranja
Gnjatovic Koncepti Programiranja
Концепти функционалног и
императивног програмирања ић
.
ов
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
на
др
ж
ан
а.
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
Предговор аутора
.
ић
Књиге из програмирања неоправдано често полазе од претпоставке да
ов
jе програмирање занатска вештина. Такво редуковање поjма програми-
а.
рања не само да jе неправедно према информатици као грани науке, већ
ат
ан
доводи до тога да се „вештина” програмирања представља кроз призму
Гњ
ж
програмских jезика, стављаjући синтаксичке детаље у фокус пажње, и
др
остављаjући читаоца ускраћеног за увид у фундаменталне концепте про-
ан
грамирања. за
У овоj књизи примењен jе другачиjи приступ. Ако тражите детаљну
ил
су
спецификациjу синтаксе неког програмског jезика, нећете jе наћи — мада
М
ав
пр
jезике.
Први део књиге посвећен jе функционалном програмирању, што ни-
на
vii
viii
.
ић
ов
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Садржаj
.
ић
Предговор аутора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii
ов
а.
Листа слика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
ат
ан
Гњ
ж
др
Део I Концепти функционалног програмирања
ан
за
ил
1.1 Увод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
М
ав
1.4.1 Предикати . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
–2
1.5 Стрингови . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
а
20
Св
иj
1.8 Задаци . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
рз
ix
x Садржаj
2.8 Задаци . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3 Рекурзивне функциjе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.1 Увод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.2 Рекурзивно издваjање цифара из целих броjева . . . . . . . . . . 72
3.2.1 Збир цифара ненегативног броjа . . . . . . . . . . . . . . . . . . 72
3.2.2 Броj цифара ненегативног целог броjа . . . . . . . . . . . . . 79
3.2.3 Производ цифара ненегативног целог броjа . . . . . . . . 79
3.2.4 Обртање редоследа цифара у ненегативном броjу . . 83
3.2.5 Проналажење цифре у ненегативном целом броjу . . 84
3.3 Рекурзивна обрада монотоних секвенци броjева . . . . . . . . . . 85
3.3.1 Факториjел ненегативног целог броjа . . . . . . . . . . . . . . 86
3.3.2 Фибоначиjев низ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.3.3 Прости броjеви . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
.
ић
3.3.4 Наjмањи делилац . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.4 Закључне напомене . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
ов
а.
3.5 Задаци . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
ат
ан
Рекурзивне структуре података . . . . . . . . . . . . . . . . . . . . . . . . . 101
Гњ
ж
4.1 Увод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
др
4.2 Листа као рекурзивна структура података . . . . . . . . . . . . . . . 101
ан
ав
Св
иj
а.
6.5 Итеративна обрада матрица целих броjева . . . . . . . . . . . . . . . 196
ат
ан
6.6 Итеративна обрада стрингова . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Гњ
ж
6.8 Задаци . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
др
ан
за
Библиографиjа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
ил
су
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
Листа слика
.
ић
1.1 Резултат израчунавања израза (1.7). . . . . . . . . . . . . . . . . . . . . . 5
ов
а.
1.2 Резултат израчунавања израза (1.8). . . . . . . . . . . . . . . . . . . . . . 5
ат
ан
1.3 Приказ израчунавања израза (1.8) по корацима. . . . . . . . . . . 5
Гњ
ж
1.4 Хиjерархиjски приказ израчунавања израза (1.8). . . . . . . . . . 5
др
1.5 Резултат израчунавања израза (1.9). . . . . . . . . . . . . . . . . . . . . . 6
ан
ав
комплексним броjевима. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
02
пр
Св
дељеника. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.16 Илустрациjа функциjе quotient. . . . . . . . . . . . . . . . . . . . . . . . . . . 13
на
xiii
xiv ЛИСТА СЛИКА
а.
1.40 Разлика између повратних вредности функциjа equal? и =
ат
ан
кад им се саопште улазни аргументи истих вредности, али
Гњ
ж
различитих прецизности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
др
2.1 Илустрациjа коришћења променљиве. . . . . . . . . . . . . . . . . . . . . 32
ан
за
2.2 Илустрациjа дефинисања глобалних променљивих. . . . . . . . . 32
ил
недефинисане променљиве. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.4 Функциjа коjа прихвата броj x као улазни аргумент, и
а
1.
ав
израчунава вредност x2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
02
2.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
а
Св
преступна. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.14 Друга дефинициja функциje коjа проверава да ли jе
година преступна. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.15 Трећа дефинициja функциje коjа проверава да ли jе
година преступна. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.16 Илустрациjа извршавања функциjа дефинисаних на сл.
2.13, 2.14 и 2.15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
ЛИСТА СЛИКА xv
а.
2.26 Друга дефинициja функциje коjа прихвата три реална
ат
ан
броjа, и као резултат враћа наjвећи од њих. . . . . . . . . . . . . . . . 45
Гњ
ж
2.27 Приказ извршавања функциjе дефинисане на сл. 2.26 кад
др
jоj се саопште изабрани улазни аргументи. . . . . . . . . . . . . . . . . 46
ан
коцке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
а
ав
пр
извршавање. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
–2
Св
коцке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
иj
општем случаjу. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
ве
а.
резултат враћа већи од њих. Функциjа f дефинисана jе на
ат
ан
сл. 2.46. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Гњ
ж
2.53 Саопштавање безимене функциjе као улазног аргумента. . . 57
др
2.54 Лексички опсег улазног аргумента. . . . . . . . . . . . . . . . . . . . . . . 58
ан
ав
повезивање. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
02
пр
Св
променљивих. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
20
сл. 2.44. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
иj
повезивање. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
ве
а.
саопшти улазни аргумент n = 1234. . . . . . . . . . . . . . . . . . . . . . . . 75
ат
ан
3.5 Репно-рекурзивна функциjа коjа за дати ненегативни цели
Гњ
ж
3.6 Резултат позивања функциjе дефинисане на сл. 3.5 кад jоj
др
се саопшти улазни аргумент n = 1234. . . . . . . . . . . . . . . . . . . . . 78
ан
за
3.7 Приказ итеративног извршавања функциjе дефинисане на
ил
ав
Св
цифара. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
рз
цифара. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
на
цифара. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.14 Оптимизована репно-рекурзивна функциjа коjа за дати
ненегативни цели броj израчунава производ његових
цифара. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.15 Резултат позивања функциja дефинисаних на сл. 3.11,
3.12, 3.13 и 3.14 кад им се саопште улазни аргументи
n1 = 1234 и n2 = 1204. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
xviii ЛИСТА СЛИКА
а.
ненегативног целог броjа n. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
ат
ан
3.23 Репно-рекурзивна функциjа коjа израчунава факториjел
Гњ
ж
датог ненегативног целог броjа n. . . . . . . . . . . . . . . . . . . . . . . . . 87
др
3.24 Рекурзивна функциjа коjа израчунава n-ти елемент
ан
Фибоначиjевог низа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
за 88
3.25 Резултат позивања функциjе дефинисане на сл. 3.24 кад
ил
ав
пр
Св
аргумента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.31 Репно-рекурзивна функциjа коjа израчунава n-ти елемент
д
Ра
Фибоначиjевог низа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.32 Резултат позивања функциjе дефинисане на сл. 3.31 кад
jоj се саопшти улазни аргумент n = 6. . . . . . . . . . . . . . . . . . . . . 93
3.33 Приказ итеративног извршавања функциjе дефинисане на
сл. 3.31 кад jоj се саопшти улазни аргумент n = 6. . . . . . . . . . 93
3.34 Репно-рекурзивна функциjа коjа проверава да ли jе
природни броj n прост. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
ЛИСТА СЛИКА xix
а.
4.1 Интерно представљање уређеног пара у рачунарскоj
ат
ан
мемориjи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Гњ
ж
4.3 Интерно представљање уређеног пара коjи садржи само
др
први елемент, док jе други елемент недефинисан. . . . . . . . . . 102
ан
за
4.4 Конструисање уређеног пара у коjем jе само први елемент
ил
дефинисан. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
су
М
ав
list. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
20
Св
а.
4.26 Резултати позивања функциjе take кад jоj се саопште
ат
ан
изабрани аргументи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Гњ
ж
4.27 Рекурзивна функциjа коjа прихвата листу l и ненегативни
др
цели броj k, и враћа нову листу коjа садржи првих n
ан
елемената листе k. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
за 115
4.28 Резултати позивања функциjе дефинисане на сл. 4.27 кад
ил
ав
пр
Св
а.
4.46 Рекурзивна функциjа коjа израчунава збир броjева
ат
ан
садржаних у листи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Гњ
ж
4.47 Резултати позивања функциjе дефинисане на сл. 4.46 кад
др
jоj се саопште изабрани улазни аргументи. . . . . . . . . . . . . . . . . 125
ан
ав
пр
Св
а.
аргумената произвољних типова података, и израчунава
ат
ан
збир свих броjева садржаних у њоj. . . . . . . . . . . . . . . . . . . . . . . 136
Гњ
ж
4.65 Резултати позивања функциjе дефинисане на сл. 4.64 кад
др
jоj се саопште изабрани улазни аргументи. . . . . . . . . . . . . . . . . 136
ан
ав
Св
променљивих. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
5.7 Додељивање вредности променљивоj. . . . . . . . . . . . . . . . . . . . . 150
д
Ра
а.
5.21 Декларисање низа и приступање његовим елементима. . . . . 159
ат
ан
5.22 Илустрациjа стања у мемориjи релевантних за примере
Гњ
ж
(а,б) 5.17 и (в) 5.18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
др
5.23 Приступ елементима jеднодимензионалног низа. . . . . . . . . . . 160
ан
ав
пр
Св
а.
6.10 Трећа функциja коjа израчунава факториjел датог
ат
ан
ненегативног целог броjа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Гњ
ж
6.11 Функциja коjа проверава да ли jе дати природни броj n
др
прост. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
ан
броjева. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
су
М
ав
пр
Св
.
ић
ов
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
Листа табела
.
ић
1.1 Примери елемената скупова броjева. . . . . . . . . . . . . . . . . . . . . . 9
ов
а.
1.2 Илустрациjа изабраних предиката коjи се односе на броjеве. 21
ат
ан
Гњ
ж
функциja дефинисаних на сл. 3.11, 3.12, 3.13 и 3.14 кад им
др
се саопште улазни аргументи n1 = 1234 и n2 = 1204. . . . . . . . . 82
ан
за
3.2 Броjеви рекурзивних позивања — c(n) — функциjе
ил
ав
Св
иj
xxvii
xxviii ЛИСТА ТАБЕЛА
а.
6.11 Приказ итеративног извршавања функциjе дефинисане на
ат
ан
сл. 6.22 кад jоj се саопште изабрани аргументи. У свакоj
Гњ
ж
итерациjи, елемент a[i][ j] означен jе сивом боjом. . . . . . . . . . . 199
др
6.12 Приказ итеративног извршавања функциjе дефинисане на
ан
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
програмирања
Концепти функционалног
Део I
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
Поглавље 1
Атомски типови података
.
ић
1.1 Увод
ов
а.
ат
ан
Сви програми манипулишу подацима. Због тога су сви програмски
jезици дизаjнирани тако да омогућаваjу примену различитих типова по-
Гњ
ж
датака. Упркос разликама између програмских jезика, jедан од заjеднич-
др
ких дизаjнерских концепата jе да се типови података могу поделити у две
ан
широке категориjе:
за
ил
ав
Св
иj
3
4 1 Атомски типови података
(+ 1 2) . (1.2)
а.
2 · (7 + 3) − 4 . (1.4)
ат
ан
Гњ
ж
др
• због заграда, прво се извршава операциjа сабирања, (7 + 3) = 10,
ан
су
ав
пр
–2
(+ 7 3) , (1.5)
а
20
Св
а.
(∗ 2 (+ 7 3)) , (1.6)
©
иj
(− (∗ 2 (+ 7 3)) 4) . (1.7)
на
сл. 1.1).
Пример 1.2. Израчунаjмо вредност следећег израза:
(/ (∗ 4 (+ 3 6)) 3) . (1.8)
.
ић
> ( / ( ∗ 4 (+ 3 6 ) ) 3 )
ов
12
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
( / ( ∗ 4 (+ 3 6 ) ) 3 )
М
( / (∗ 4 9) 3)
( / 36 3 )
а
1.
ав
12
02
пр
–2
Св
20
а.
©
12
иj
рз
/ 36 3
ве
на
∗ 4 9
Слика 1.4 Хиjерархиjски
д
Ра
приказ израчунавања
израза (1.8). + 3 6
(− (+ 4 3) (+ 2 1)) . (1.9)
6 1 Атомски типови података
а.
чиjи резултат извршавања зависи од претпоставке1 одређеног редоследа
ат
ан
израчунавања делова израза на истом хиjерархиjском нивоу.
Гњ
ж
др
ан
> (− (+ 4 3 ) (+ 2 1 ) ) за
4
ил
су
М
ав
02
пр
–2
4
а
20
Св
20
− 7 3
а.
©
приказ израчунавања
израза (1.9). + 4 3 + 2 1
рз
ве
на
1+2+3+4+5 (1.10)
1
На разматрање ове претпоставке вратићемо се у 2. поглављу (в. примере 2.6 и 2.10).
1.2 Аритметички изрази и префиксна нотациjа 7
(+ (+ (+ (+ 1 2) 3) 4) 5) . (1.11)
> (+ (+ (+ (+ 1 2 ) 3 ) 4 ) 5 )
15
> (+ 1 2 3 4 5 )
15
.
ић
Слика 1.7 Резултати израчунавања израза (1.11) и (1.12).
ов
а.
ат
Слично, изрази:
ан
Гњ
ж
(− 1 2 3), (∗ 1 2 3), (/ 1 2 3) , (1.13)
др
ан
(− (− 1 2) 3) ,
су
М
(∗ (∗ 1 2) 3) , (1.14)
а
(/ (/ 1 2) 3) ,
1.
ав
02
пр
20
Св
> (− 1 2 3)
20
−4
а.
> (− (− 1 2 ) 3 )
©
иj
−4
> (∗ 1 2 3)
рз
6
ве
> (∗ (∗ 1 2) 3)
6
на
> (/ 1 2 3)
1
д
6
> ( / ( / 1 2) 3)
Ра
1
6
(+ (− ( / (+ 34 1 4 )
( / 16 4 ) )
(∗ ( / 8 4)
(− 8 5 1 ) ) )
( ∗ (− 5 2 ) 3 ) )
.
ић
ов
Слика 1.9 Читљивиjи запис израза (1.15).
а.
ат
ан
Гњ
ж
носи информациjу о структури ко̂да, док у другим програмским jезици-
др
ма (укључуjући Ракет) оно само доприноси читљивости ко̂да. У сваком
ан
за
случаjу, програмер треба да усвоjи и примењуjе одговараjући стил писа-
ил
ав
програмера.
02
пр
–2
а
20
Св
а.
иj
• цели броjеви Z,
ве
• рационални броjеви Q,
• реални броjеви R,
на
• комплексни броjеви C,
д
Z⊂Q⊂R⊂C. (1.16)
Z, цели броjеви: 0, 1, −2
Q, рационални броjеви: 21 , − 34 , 32
R, реални броjеви: 1, 2, 3, 45, −0, 3333333333333333
C, комплексни броjеви: i, 1 + 3i, 5 − 6i
.
ић
Пример 1.6. Примери основних аритметичких операциjа над комплек-
ов
а.
ат
ан
Гњ
ж
> (+ 2+1 i 3+4 i )
др
5+5 i
ан
2+11 i
М
2 /5 − 1/5i
1.
ав
02
пр
а
20
Св
20
ђе jе цели броj ((+ 1 2) → 3). Међутим, ако бар jедан сабирак ниjе цео
броj, збир ниjе целоброjни ((+ 1.0 2) → 3.0). Аналогне напомене важе и
ве
2
За запис реалних броjева датих у табели 1.1 коришћен jе зарез као децимални
сепаратор, што jе уобичаjена пракса у Србиjи. У програмским jезицима, укључуjући
Ракет, уобичаjено се користи тачка као децимални сепаратор, што намеће обавезу да
пратимо ово правило приликом писања изворних програмских ко̂дова.
10 1 Атомски типови података
> (+ 1 2)
3
> (+ 1.0 2)
3.0
> (− 1 2)
−1
> (− 1 2.0)
−1 . 0
> (∗ 1 2)
2
> (∗ 1 2.0)
2.0
> (/ 1 2)
1 /2
> (/ 1.0 2)
0.5
.
ић
ов
Слика 1.11 Илустрациjа зависности резултата примене аритметичких оператора +,
а.
−, ∗ и / од врсте операнада.
ат
ан
Гњ
ж
• целe броjевe,
др
• рационалнe броjевe чиjи су броjиоци и имениоци цели броjеви,
ан
за
• комплекснe броjевe чиjи су реални и имагинарни делови прецизни бро-
ил
jеви.
су
М
ав
• реалне броjеве (тj., броjеве чиjи запис садржи децимални зарез или
02
броjеви.
а
20
Св
Пример 1.8. Ракет чува прецизност броjева кад год jе то могуће. Нпр.,
20
иj
(/ 3 9) , (1.17)
рз
3 1
ве
д
Ра
> ( / 3 9)
1
3
> (/ 3.0 9.0)
0.3333333333333333
а.
Може се стећи утисак да jе губитак прецизности занемарљив, али то,
ат
ан
у општем случаjу, ниjе тачно. Примена аритметичких оператора над не-
Гњ
ж
прецизним броjевима захтева извесну пажњу, jер чим jе jедан операнд
др
непрецизни броj, резултат jе такође непрецизан.
ан
за
Пример 1.9. Ако упоредимо резултате непрецизног одузимања броjева
ил
ав
02
пр
> (− 1 0 . 9 )
–2
0.09999999999999998
а
20
> (− 2 1 . 9 )
Св
0.10000000000000009
20
а.
©
иj
а.
• ако jе дељеник jеднак непрецизноj вредности нуле, резултат дељења
ат
ан
биће jеднак специjалноj вредности +nan.0.
Гњ
ж
Примери свих наведених случаjева дати су на сл. 1.15.
др
ан
за
ил
> ( / 1 0)
су
. . . / : d i v i s i o n by z e r o
М
> (/ 1 0.0)
а
+i n f . 0
1.
ав
> ( / −1 0 . 0 )
02
пр
−inf . 0
> (/ 0 0.0)
–2
0
а
20
Св
а.
©
иj
> ( quotient 9 4)
2
.
ић
> ( q u o t i e n t −17 5 )
−3
ов
а.
> ( quotient 9.0 4.0)
ат
ан
2.0
> ( quotient 9.1 4) ← неодговараjући тип улазног аргумента
Гњ
ж
. . . quotient : contract violation
др
expected : i n t e g e r ?
given : 9.1
ан
argument p o s i t i o n : 1 s t
за
ил
o t h e r arguments . . . :
су
М
ав
02
пр
jеви коjи се без губитака могу конвертовати у целе броjеве, при чему jе
20
а.
> ( r e m a i n d e r 12345 1 0 )
ат
ан
5
Гњ
ж
др
Слика 1.18 Илустрациjа издваjања цифара из целог броjа.
ан
за
> ( numerator 3 /4 )
ил
3
су
М
ав
> ( numerator 2 )
2
02
пр
> ( numerator 0 . 2 5 )
–2
1.0
а
Св
. . . numerator : c o n t r a c t v i o l a t i o n
20
expected : r a t i o n a l ?
g i v e n : 2+3 i
а.
©
иj
рз
Пример 1.13. Као групу функциjа коjе прихватаjу реалне аргументе по-
на
.
ић
• round заокружуjе x на наjближи цели броj — ако jе x подjеднако удаљен
ов
а.
од два суседна цела броjа, заокруживање се врши на наjближи парни
ат
ан
цели броj,
Гњ
ж
што jе илустровано на сл. 1.21. Кад се овим функциjама проследи ком-
др
плексни броj, индикуjе се грешка.
ан
за
ил
су
> ( truncate 9.3)
М
9.0
а
> ( t r u n c a t e −9 . 3 )
1.
ав
−9 . 0
02
9.0
–2
> ( f l o o r −9 . 3 )
а
−10 . 0
20
Св
10.0
а.
> ( c e i l i n g −9 . 3 )
©
−9 . 0
иj
> ( round 9 . 3 )
рз
9.0
> ( round 9 . 5 )
ве
10.0
> ( round 1 0 . 5 )
на
10.0
д
> ( r e a l − p a r t 1+2 i )
1
> ( imag − part 1+2 i )
2
.
ић
> ( expt 2 3)
ов
8
а.
> ( e x p t 9 1 /2 )
ат
ан
3
Гњ
> ( e x p t −1 1 /2 )
ж
0+1 i
др
> ( e x p t 1+1 i 2 )
ан
0+2 i за
> ( s q r t 4)
ил
2
су
> ( s q r t 2)
М
1.4142135623730951
а
> ( s q r t −1)
1.
ав
0+1 i
02
пр
–2
Св
20
а.
©
иj
рз
4
Ово не уклања ограничења условљена дефинициjом функциjе, попут забране деље-
ња прецизном вредношћу нуле.
1.4 Буловске вредности и функциjе 17
а.
осталим операциjама релациjе могу саопштити реални броjеви, али не
ат
ан
и комплексни броjеви с ненултим имагинарним деловима — за пример
Гњ
ж
поређења оваквих броjева в. пример 2.8, у 2. поглављу.
др
ан
Св
иj
5
У програмском jезику Ракет, буловске функциjе прихватаjу и улазне аргументе
коjи нису буловске вредности, и враћаjу вредности коjе нису обавезно буловске (нпр.,
(and #t 1) → 1, (or 2 #f) → 2), али те аспекте ових функциjа нећемо овде разматрати.
18 1 Атомски типови података
> (= 2 2 . 0 )
#t
> (= 2 )
#t
> (= 1 2 )
#f
> (< 2 1 )
#f
> (< 1 2 3 )
#t
> (< 1 2 2 3 )
#f
> (<= 2 1 )
#f
> (<= 1 2 2 3 )
#t
.
ић
> (> 1 2 )
#f
ов
> (> 3 2 1 )
а.
#t
ат
ан
> (> 3 2 2 1 )
Гњ
#f
ж
(> 1 )
др
#t
ан
> (>= 3 2 2 1 )
за
#t
ил
> (>= 1 2 )
су
М
#f
> (= 1 2+3 i )
а
1.
ав
#f
> (< 1 2+3 i )
02
пр
. . . <: c o n t r a c t v i o l a t i o n
–2
expected : r e a l ?
а
g i v e n : 2+3 i
20
Св
argument p o s i t i o n : 2nd
20
o t h e r arguments . . . :
а.
©
иj
а.
ат
ан
Слика 1.24 Илустрациjа буловских функциjа: конjункциjа, дисjункциjа и негациjа.
Гњ
ж
др
> ( or ( and (> 5 3 ) (= 1 2 ) ) ( not (= (+ 1 2 ) (− 3 4 ) ) ) #f )
ан
#t
за
ил
су
ав
( or ( and #t #f ) ( not (= 3 −1 ) ) #f )
02
пр
( or #f ( not #f ) #f )
–2
( or #f #t #f )
а
#t
20
Св
20
иj
#t
рз
ве
or #f #t #f
на
and #t #f not #f
д
Ра
> 5 3 = 1 2 = 3 −1
+ 1 2 − 3 4
> ( boolean=? #t #f )
#f
> ( boolean=? #t #t )
#t
> ( boolean=? #t #t #t ) ← неодговараjући броj улазних аргумената
. . . boolean=? : a r i t y mismatch ;
.
ић
t h e e x p e c t e d number o f arguments d o e s not match t h e g i v e n number
expected : 2
ов
given : 3
а.
arguments . . . :
ат
ан
> ( boolean=? #t 1 ) ← неодговараjући тип улазног аргумента
Гњ
ж
. . . boolean=? : c o n t r a c t v i o l a t i o n
expected : boolean?
др
given : 1
ан
argument p o s i t i o n : 2nd
за
o t h e r arguments . . . :
ил
су
М
ав
02
пр
–2
а
20
Св
1.4.1 Предикати
20
а.
©
а.
rational ? #t #t #t #f #f #f #f #f
ат
ан
integer? #t #f #f #f #f #f #f #f
exact? #t #t #f #t #f #f #f #f
Гњ
ж
inexact? #f #f #t #f #t #t #t #f
др
ан
за
ил
су
М
#t
1.
ав
02
пр
–2
Св
20
иj
рз
> ( b o o l e a n ? #f )
#t
ве
> ( boolean? 1)
#f
на
д
Ра
1.5 Стрингови
а.
Стрингови могу да садрже слова различитих писама, празни простор,
ат
ан
цифре, знакове интерпункциjе, итд. — укључуjући и специjалне симбо-
Гњ
ж
ле. Специjални симболи се представљаjу знаковним биграмима коjе чине
др
обрнута коса црта (\) и симбол. Неки од специjалних симбола су:
ан
за
• \n означава прелазак у нови ред,
ил
• \"означава наводник,
М
• \’ означава полунаводник,
а
1.
ав
пр
Св
20
а.
novi
иj
red
рз
’polunavodnici’
Ра
7
Овде се мисли на наводнике коjи се користе у енглеском правопису, а не у српском.
1.5 Стрингови 23
а.
ат
стринг: о с н о в и ␣ п р о г р а м и р а њ а
ан
индекси: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Гњ
ж
стринг: o s n o v i ␣ p r o g r a m i r a n j a
др
индекси: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ан
за
стринг: \" n a v o d n i c i \"
ил
индекси: 0 1 2 3 4 5 6 7 8 9 10
су
М
ав
02
пр
–2
1. стринг s дужине l,
д
Ра
> ( string − length "основи програмирања " )
19
> ( string − length " osnovi programiranja ")
20
> ( string − length "\" n a v o d n i c i \ " " )
11
.
ић
> ( string − length " n o v i \ nred " )
8
ов
а.
0
ат
ан
Гњ
ж
Слика 1.33 Илустрациjа функциjе string −length.
др
ан
за
ил
1.
ав
а.
©
иj
буловске вредности:
• функциjа string=? враћа вредност #t ако су сви улазни аргументи
jеднаки, а у супротном враћа вредност #f,
• функциjа string<? враћа вредност #t ако jе низ улазних аргумена-
та лексикографски уређен као строго растући, а у супротном враћа
вредност #f,
1.5 Стрингови 25
> ( substring " o s n o v i p r o g r a m i r a n j a " 1 6 )
" snovi "
> ( substring " o s n o v i p r o g r a m i r a n j a " 7 1 5 )
" p r o g r a mi "
> ( substring " o s n o v i p r o g r a m i r a n j a " 7 )
" programiranja "
> ( substring " o s n o v i p r o g r a m i r a n j a " 7 7 )
""
> ( substring " o s n o v i p r o g r a m i r a n j a " 1 3 0 ) ← прекорачење опсега индекса
. . . substring : e n d i n g i n d e x i s out o f r a n g e
e n d i n g i n d e x : 30
s t a r t i n g index : 1
v a l i d range : [ 0 , 20]
s t r i n g : " osnovi programiranja "
.
ић
Слика 1.35 Илустрациjа функциjе substring.
ов
а.
ат
ан
та лексикографски уређен као монотоно неопадаjући, а у супротном
Гњ
ж
враћа вредност #f,
др
• функциjа string>? враћа вредност #t ако jе низ улазних аргумената
ан
вредност #f,
су
вредност #f.
1.
ав
02
пр
1.36.
а
20
Св
а.
иj
рз
ве
а.
ат
ан
> ( s t r i n g ? "12345")
Гњ
ж
#t
др
> ( s t r i n g ? 12345)
#f
ан
за
ил
су
Слика 1.37 Илустрациjа функциjе string ?.
М
а
1.
ав
пр
Св
• броj n,
20
• основу броjног система b ∈ {2, 8, 10, 16}, при чему jе оваj улазни ар-
а.
иj
• стринг s,
8
Неки примери имплицитне конверзиjе између врста броjева размотрени су у примеру
1.7. Иако Ракет чува прецизност броjева кад год jе то могуће, имплицитне конверзиjе,
у општем случаjу, могу представљати ризик у развоjу софтвера, посебно ако про-
грамер ниjе свестан њиховог имплицитног извршавања или ниjе упознат с детаљима
њиховог извршавања.
9
Сложениjе дефинициjе ове фукциjе доступне су у [6].
1.6 Поређење вредности различитих типова података 27
• основy броjног система b ∈ {2, 3, . . . , 16}, при чему jе оваj улазни ар-
гумент опцион — ако ниjе експлицитно задат, његова подразумевана
вредност jеднака jе 10,
и враћа децимaлни броj коjи се добиjе кад се s интерпретира као броj за-
писан у броjном систему с основом b, или вредност #f ако улазни стринг
s не може да се конвертуjе у броj.
Пример 1.28. Функциjе number−>string и string−>number илустроване
су на сл. 1.38.
> ( number − >string 25)
"25"
> ( number − >string 25 2 )
"11001"
.
ић
> ( number − >string 25 1 6 )
ов
"19"
а.
> ( string − >number "101")
ат
ан
101
> ( string − >number "101" 2 )
Гњ
ж
5
др
> ( string − >number " abc " )
ан
#f за
ил
су
а
1.
ав
02
пр
–2
Св
20
куjе се грешка (в. пример 1.18 и сл. 1.28). За разлику од њих, функциjа
на
а.
> ( exact? 1.0)
ат
ан
#f
> (= 1 1 . 0 )
Гњ
ж
#t
др
> ( equal? 1 1.0)
ан
#f
за
ил
су
ав
02
пр
а
20
10
Ракет садржи и друге атомске типове података (нпр., атомски тип података коjи
служи за представљање дигиталних слика), али они нису разматрани, jер су специ-
фични за дати програмски jезик.
1.8 Задаци 29
.
ић
Библиографскe напоменe:
ов
а.
• Префиксна нотациjа и рекурзивно израчунавање израза у про-
ат
ан
грамском jезику Ским описани су у секциjама „1.1.1 Expressions”
Гњ
ж
и „1.1.3 Evaluating Combinations” библиографског навода [1].
др
• Преглед атомских типова у програмском jезику Ракет дат jе у
ан
су
М
а
1.
ав
1.8 Задаци
02
пр
–2
Св
2 + 4 · ( 32 − (1 + 3))
20
.
2 + 4 · 32 − 1 + 3
а.
©
иj
.
ић
ов
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Поглавље 2
Основни инструменти апстракциjе у
програмирању
.
ић
Сваки нетривиjални програм састоjи се од низа дефинициjа, иза коjег
ов
обично следи израз коjи укључуjе неке (или све) од претходно наведених
а.
дефинициjа. Под дефинициjама подразумевамо инструменте апстракци-
ат
ан
jе у програмирању. У овом поглављу ћемо се упознати с два основна
Гњ
ж
инструмента апстракциjе:
др
• дефинисањем променљивих, тj., додељивањем симболичких имена вред-
ан
ностима,
за
ил
циjама.
М
ав
пр
безимених функциjа.
–2
а
20
Св
20
иj
31
32 2 Основни инструменти апстракциjе у програмирању
> ( define a 2 )
> a
2
> (∗ 3 a )
6
> ( expt a 3)
8
.
( define ime_promenljive izraz) , (2.2)
ић
ов
а.
тат израчунавања произвољног, синтаксички исправног израза, укључу-
ат
ан
jући (али не ограничаваjући се на) изразе коjе смо разматрали у 1. по-
Гњ
ж
глављу.
др
Пример 2.2. Секвенцом команди приказаном на сл. 2.2, променљивоj a
ан
за
додељуjе се вредност 2, променљивоj b вредност 5, променљивоj c вред-
ил
1.
ав
> ( define b (+ 3 a ) )
пр
> a
Св
2
20
> b
а.
5
©
иj
> c
#t
рз
> d
ве
а.
> ( define f (+ e 1 ) )
ат
. . . e : undefined ;
ан
ca nn ot r e f e r e n c e an i d e n t i f i e r b e f o r e i t s definition
Гњ
ж
др
Слика 2.3 Индиковање грешке изазване референцирањем недефинисане променљи-
ан
ве.
за
ил
су
М
ав
Св
иj
датог програма.
рз
ве
f1 (x) = x2 , x ∈ C , (2.4)
.
ић
1 ( define ( f 1 x ) ( ∗ x x ) )
ов
а.
ат
ан
Слика 2.4 Функциjа коjа прихвата броj x као улазни аргумент, и израчунава вред-
Гњ
ж
ност x2 .
др
ан
за
ил
структура дефинициjе
М
ав
и израчунава вредност x2
02
пр
–2
а
20
Св
20
> f1
а.
#<procedure : f1>
©
> ( f1 2)
иj
4
рз
> ( f 1 −1 . 5 )
2.25
ве
> ( f 1 1+2 i )
−3+4 i
на
> (− ( f 1 3 ) ( f 1 2 ) )
д
5
Ра
Слика 2.6 Резултати позивања функциjе дефинисане на сл. 2.4 кад jоj се саопште
изабрани улазни аргументи.
2.2 Дефинисање функциjа 35
Први елемент овог израза чини симбол define, други елемент чине име
функциjе и низ улазних аргумената, а трећи елемент jе подизраз коjи
представља поступак израчунавања вредности функциjе, и уобичаjено
се назива телом функциjе.
.
ић
1 ( define ( polinom x )
ов
2 (+ ( ∗ 5 x x )
а.
3 (∗ 2 x )
ат
ан
4 1))
Гњ
ж
др
Слика 2.7 Дефинициja функциje f (x) = 5x2 + 2x + 1.
ан
за
ил
су
М
> ( polinom 1 )
а
1.
ав
8
> ( polinom 1 . 5 )
02
пр
15.25
–2
> ( polinom 3 − 2i )
а
32 − 64i
20
Св
20
иj
рз
3
Приметимо да синтаксичка структура дефинициjе функциjе задовољава критериjу-
ме префиксног записа.
36 2 Основни инструменти апстракциjе у програмирању
1 ( define ( zapremina a ) ( e x p t a 3 ) )
а.
ат
ан
Гњ
ж
др
претпоставком да jе a позитивни реални броj4 . У складу с тим, функци-
ан
су
функциjи нема обавезу да задовољи претпоставку коjу jе увео програ-
М
ав
кад се функциjи саопшти комплексни или негативни броj, jер тад функ-
02
пр
4
Формално представљено, дефинициjа дата на сл. 2.9 имплементира функциjу f (a) =
a3 , a ∈ C, а требало би да имплементира функциjу f (a) = a3 , a ∈ R+ .
2.2 Дефинисање функциjа 37
1 ( define ( d e l j i v ? x y )
2 ( and ( not (= y 0 ) )
3 (= ( r e m a i n d e r x y ) 0 ) ) )
Слика 2.11 Дефинициja функциje коjа проверава дељивост jедног целог броjа дру-
гим целим броjем.
.
ић
ов
> ( d e l j i v ? 9 3)
а.
#t
ат
ан
> ( d e l j i v ? 9 4)
Гњ
#f
ж
> ( d e l j i v ? 9 0)
др
#f
ан
за
ил
ав
пр
а
20
(= (remainder x y) 0) . (2.6)
Св
20
5
Следећи конвенциjу именовања предиката (в. секциjу 1.4.1, у 1. поглављу), назив
ове функциjе завршава се знаком питања. Ова конвенциjа именовања функциjа ниjе
обавезна.
38 2 Основни инструменти апстракциjе у програмирању
а.
интерпретатора и преводилаца. Дефинициjа функциjе deljiv ?, коjа jе у
ат
ан
складу с овом препоруком, дата jе у примеру 2.10.
Гњ
ж
Пример 2.7. Дефинишимо функциjу коjа проверава да ли jе дата година
др
преступна. Преступна година jе дељива броjем 4, а ако jе дељива броjем
ан
вредности садржи само два елемента: #t, ако jе година преступна, одно-
М
ав
пр
Св
супротном,
а.
©
супротном,
рз
p ∧ (q ⇒ r) , (2.9)
Ра
6
Овде примењуjемо таутологиjу: (q ⇒ r) ⇔ (¬q ∨ r)
2.2 Дефинисање функциjа 39
1 ( define ( p r e s t u p n a ? g o d i n a )
2 ( and
3 ( d e l j i v ? godina 4)
4 ( or
.
ић
5 ( not ( d e l j i v ? g o d i n a 1 0 0 ) )
ов
6 ( d e l j i v ? godina 4 0 0 ) ) ) )
а.
ат
ан
Слика 2.13 Дефинициja функциje коjа проверава да ли jе година преступна.
Гњ
ж
др
ан
за
ил
1 ( define ( p r e s t u p n a ? g o d i n a )
су
2 ( and
М
3 (= ( r e m a i n d e r g o d i n a 4 ) 0 )
а
4 ( or
1.
ав
5 ( not (= ( r e m a i n d e r g o d i n a 1 0 0 ) 0 ) )
02
пр
6 (= ( r e m a i n d e r g o d i n a 4 0 0 ) 0 ) ) ) )
–2
а
20
а.
©
(p ∧ ¬q) ∨ (p ∧ r) . (2.11)
д
Ра
1 ( define ( p r e s t u p n a ? g o d i n a )
2 ( or
3 ( and
4 ( d e l j i v ? godina 4)
5 ( not ( d e l j i v ? g o d i n a 1 0 0 ) ) )
6 ( d e l j i v ? godina 4 0 0 ) ) )
а.
> ( prestupna? 1900)
ат
#f
ан
> ( prestupna? 2000)
Гњ
ж
#t
др
ан
за
Слика 2.16 Илустрациjа извршавања функциjа дефинисаних на сл. 2.13, 2.14 и 2.15.
ил
су
М
а
1.
ав
02
Св
20
иj
izraz2.
д
.
Ра
Пример 2.8. Дефинишимо функциjу коjа прихвата два броjа, и као ре-
зултат враћа већи од њих, тj.:
1 ( define ( maks2 a b )
2 ( i f (> a b ) a b ) )
Слика 2.17 Дефинициja функциje коjа прихвата два реална броjа, и као резултат
враћа већи од њих.
(бар jедан) комплексни броj. Ово ниjе неочекивано, jер се оператор >
а.
ат
ан
поглављу).
Гњ
ж
др
ан
> ( maks2 3 4 )
за
4
ил
су
> ( maks2 −5 . 5 −6 . 2 )
М
−5 . 5
> ( maks2 4 4 )
а
1.
ав
4
> ( maks2 −5 −6+2 i )
02
пр
. . . >: c o n t r a c t v i o l a t i o n
–2
expected : r e a l ?
а
g i v e n : −6+2 i
20
Св
argument p o s i t i o n : 2nd
20
o t h e r arguments . . . :
а.
©
иj
7
Правило за поређење комплексних броjева ниjе математички утемељено, и овде га
усваjамо само за потребе илустровања примене израза за условно извршавање.
42 2 Основни инструменти апстракциjе у програмирању
( maks2 3 4 )
( i f (> 3 4 ) 3 4 )
( i f #f 3 4 )
4
( maks2 −5 . 5 −6 . 2 )
( i f (> −5 . 5 −6 . 2 ) −5 . 5 −6 . 2 )
( i f #t −5.5 −6 . 2 )
−5.5
( maks2 4 4 )
( i f (> 4 4 ) 4 4 )
( i f #f 4 4 )
4
( maks2 −5 −6+2 i )
.
ић
( i f ( > −5 − 6 + 2i ) −5 −6+2 i )
... >: c o n t r a c t v i o l a t i o n ...
ов
а.
ат
ан
Слика 2.19 Приказ извршавања функциjе дефинисане на сл. 2.17 кад jоj се саопште
Гњ
ж
изабрани улазни аргументи.
др
ан
тj.:
за
ил
су
c1 > c2 ⇔ (Re(c1 ) > Re(c2 )) ∨ ((Re(c1 ) = Re(c2 )) ∧ (Im(c1 ) > Im(c2 ))) , (2.15)
М
ав
пр
2.22. Треба приметити да функциjе дате на сл. 2.17 и 2.20 генеришу исте
Св
комплексни броj.
иj
рз
ве
1 ( define ( maks2−komp a b )
2 ( i f ( or (> ( r e a l − p a r t a ) ( r e a l − p a r t b ) )
на
3 ( and (= ( r e a l − p a r t a ) ( r e a l − p a r t b ) )
4 (> ( imag − part a ) ( imag − part b ) ) ) )
д
5 a b))
Ра
Слика 2.20 Дефинициja функциje коjа прихвата два комплексна броjа, и као резул-
тат враћа „већи” од њих.
.
( i f ( or (> ( r e a l − p a r t 3 ) ( r e a l − p a r t 4 ) )
ић
( and (= ( r e a l − p a r t 3 ) ( r e a l − p a r t 4 ) )
(> ( imag − part 3 ) ( imag − part 4 ) ) ) )
ов
а.
3 4)
ат
ан
( i f ( or (> 3 4 ) ( and (= 3 4 ) (> 0 0 ) ) ) 3 4 )
( i f ( or #f ( and #f #f ) ) 3 4 )
Гњ
ж
( i f #f 3 4 )
др
4
ан
( maks2−komp −5 −6+2 i )
за
ил
−5 −6+2 i )
1.
ав
( i f ( or #t ( and #f #f ) ) −5 −6+2 i )
пр
( i f #t −5 −6+2 i )
–2
−5
а
20
Св
−6+2 i
д
Ра
Слика 2.22 Приказ извршавања функциjе дефинисане на сл. 2.20 кад jоj се саопште
изабрани улазни аргументи.
44 2 Основни инструменти апстракциjе у програмирању
1 ( define ( maks3 a b c )
2 ( i f (> a b )
.
ић
3 ( i f (> a c ) a c )
ов
4 ( i f (> b c ) b c ) ) )
а.
ат
ан
Слика 2.23 Дефинициja функциje коjа прихвата три реална броjа, и као резултат
Гњ
ж
враћа наjвећи од њих.
др
ан
за
Резултати позивања ове функциjе кад jоj се саопште изабрани улазни
ил
ав
02
пр
> ( maks3 1 . 1 2 3 . 5 )
3.5
–2
> ( maks3 3 . 5 1 . 1 2 )
а
20
Св
3.5
> ( maks3 2 3 . 5 1 . 1 )
20
3.5
а.
©
иj
8
У примеру 2.8 дате су две дефинициjе функциjе maks2, на сл. 2.17 и 2.20. Пошто
обе верзиjе функциjе генеришу исте резултате кад им се саопште реални улазни ар-
гументи, свеjедно jе коjу од њих позивамо у овом примеру.
2.3 Условно извршавање 45
а.
3.5
ат
ан
Гњ
ж
Слика 2.25 Приказ извршавања функциjе дефинисане на сл. 2.23 кад jоj се саопште
др
изабрани улазни аргументи.
ан
за
ил
на сл. 2.27.
1.
ав
02
пр
1 ( define ( maks3 a b c )
–2
2 ( maks2 a ( maks2 b c ) ) )
а
20
Св
20
Слика 2.26 Друга дефинициja функциje коjа прихвата три реална броjа, и као ре-
а.
©
( maks3 1 . 1 2 3 . 5 )
( maks2 1 . 1 ( maks2 2 3 . 5 ) )
( maks2 1 . 1 3 . 5 )
3.5
( maks3 3 . 5 1 . 1 2 )
( maks2 3 . 5 ( maks2 1 . 1 2 ) )
( maks2 3 . 5 2 )
3.5
( maks3 2 3 . 5 1 . 1 )
( maks2 2 ( maks2 3 . 5 1 . 1 ) )
( maks2 2 3 . 5 )
3.5
.
Слика 2.27 Приказ извршавања функциjе дефинисане на сл. 2.26 кад jоj се саопште
ић
изабрани улазни аргументи.
ов
а.
ат
ан
нивоу. Ова функциjа прво проверава да ли jе вредност аргумента y jед-
Гњ
ж
нака нули. Ако jесте, враћа се резултат #f. У супротном, проверава се
др
услов (2.6).
ан
за
ил
1 ( define ( d e l j i v ? x y )
су
М
2 ( i f (= y 0 )
3 #f
а
1.
4 (= ( r e m a i n d e r x y ) 0 ) ) )
ав
02
пр
–2
Слика 2.28 Друга дефинициja функциje коjа проверава дељивост jедног целог броjа
другим целим броjем.
а
20
Св
20
а.
©
рачунава запремину коцке, при чему улазни аргумент ове функциjе пред-
рз
1 ( define ( zapremina a )
2 ( if ( real? a)
3 ( i f (> a 0 )
4 ( expt a 3)
5 0)
6 0))
а.
ат
ан
Слика 2.30 Илустрациjа извршавања функциjе дефинисане на сл. 2.29.
Гњ
ж
др
ан
су
М
пр
Св
.
Слика 2.32 Синтаксичка структура израза за вишеструко гранање тока извршавања
ић
програма коjи представља исти поступак израчунавања као израз 2.31.
ов
а.
ат
ан
Пример 2.12. Функциjа представљена на сл. 2.29 може се алтернативно
Гњ
ж
на сл. 2.33.
др
ан
за
ил
1 ( define ( zapremina a )
су
2 ( cond
М
3 [ ( not ( r e a l ? a ) ) 0 ]
а
4 [ (> a 0 ) ( e x p t a 3 ) ]
1.
ав
5 [ else 0 ] ) )
02
пр
–2
Св
20
а.
иj
( cond
[ bulovski−izraz−1 izraz−1 ]
[ bulovski−izraz−2 izraz−2 ]
...
.
ић
[ bulovski−izraz−n izraz−n ]
[ else izraz−0 ] )
ов
а.
ат
ан
Слика 2.34 Синтаксичка структура израза за условно извршавање, у општем слу-
Гњ
ж
чаjу.
др
ан
за
Пример 2.13. Дефинишимо функциjу коjа прихвата jедан аргумент, и
ил
су
враћа стринг чиjи садржаj индикуjе скуп броjева коjем припада улазни
М
аргумент.
а
ав
пр
–2
1 ( define ( v r s t a − b r o j a x )
20
Св
2 ( cond
20
Слика 2.35 Дефинициjа функциjе коjа прихвата jедан аргумент, и враћа стринг чиjи
на
10
Прецизниjа формулациjа гласи: i = argmin{î | bulovski−izraz−î = >}.
1≤î≤n
50 2 Основни инструменти апстракциjе у програмирању
> ( vrsta−broja 1)
" c e l i broj "
> ( v r s t a − b r o j a 1 /2 )
" racionalni broj "
> ( v r s t a − b r o j a +i n f . 0 )
" realni broj "
> ( v r s t a − b r o j a 3+5 i )
" kompleksni b r o j "
> ( vrsta−broja " broj ")
" nije broj "
а.
вишеструко гранање ниjе произвољан. Ако логички услови нису екслу-
ат
ан
зивно дисjунктни, потребно jе да се наведу у редоследу од наjспецифич-
Гњ
ж
ниjег ка наjопштиjем. Да бисмо то илустровали, посматраjмо дефинициjу
др
функциjе дату на сл. 2.37, у коjоj су логички услови у изразу за више-
ан
ав
jеднака #t, без обзира на врсту броjа (в. секциjу 1.4.1, у 1. поглављу).
02
пр
а
20
Св
1 ( define ( v r s t a − b r o j a x )
20
2 ( cond
а.
а.
ат
ан
1 ( define ( sgn x )
2 ( i f (> x 0 )
Гњ
ж
3 1
др
4 ( i f (= x 0 ) 0 −1 ) ) )
ан
за
ил
а
1.
ав
02
пр
1 ( define ( sgn x )
–2
2 ( cond
3 [ (> x 0 ) 1 ]
а
20
Св
4 [ (= x 0 ) 0 ]
5 [ e l s e −1 ] ) )
20
а.
©
иj
1 ( define ( f x )
2 ( cond
3 [ (> x 0 ) (+ x 1 ) ]
4 [ (= x 0 ) 0 ]
5 [ e l s e (− x 1 ) ] ) )
.
ић
ов
а.
1 ( define ( f x )
ат
ан
2 ( ( i f (> x 0 ) + −) x ( i f (= x 0 ) 0 1 ) ) )
Гњ
ж
др
Слика 2.42 Друга дефинициja функциje (2.21).
ан
за
ил
су
М
( f 3)
а
( ( i f (> 3 0 ) + −) 3 ( i f (= 3 0 ) 0 1 ) )
1.
ав
( ( i f #t + −) 3 ( i f #f 0 1 ) )
02
пр
(+ 3 1 )
4
–2
а
20
Св
( f 0)
( ( i f (> 0 0 ) + −) 0 ( i f (= 0 0 ) 0 1 ) )
20
( ( i f #f + −) 0 ( i f #t 0 1 ) )
а.
©
(− 0 0 )
иj
0
рз
( f −2)
ве
( ( i f (> −2 0 ) + −) −2 ( i f (= −2 0 ) 0 1 ) )
( ( i f #f + −) −2 ( i f #f 0 1 ) )
на
(− −2 1 )
−3
д
Ра
Слика 2.43 Приказ извршавања функциjе дефинисане на сл. 2.42 кад jоj се саопштe
изабрани улазни аргументи.
Иако функциjе дате на сл. 2.41 и 2.42 генеришу исте резултате кад им
се саопште исти улазни аргументи, постоjи разлика у квалитету програм-
ског ко̂да. Ко̂д приказан на сл. 2.42 jе концизниjи од ко̂да приказаног на
2.4 Функциjе вишег реда и безимене функциjе 53
.
• прихватаjу функциjе као улазне аргументе, или
ић
• враћаjу функциjе као резултат извршавања.
ов
а.
Размотримо прво пример функциjе коjа прихвата друге функциjе као
ат
ан
улазне аргументе.
Гњ
ж
Пример 2.16. Дефинишимо функциjу f коjа прихвата:
др
ан
• две функциjе g : R2 → R и h : R2 → R,
за
• и два реална броjа x и y,
ил
су
а
1.
ав
(
g(x, y), ако важи g(x, y) ≥ h(x, y) ,
f (g, h, x, y) = max { fˆ(x, y)} = (2.22)
02
пр
Св
а.
( f + − 1 2) , (2.23)
©
иj
позиву на сл. 2.45, функциjи f саопштена jе, као први улазни аргумент,
функциjа maks2 — претходно дефинисана на сл. 2.17, у примеру 2.8 —
коjа израчунава максимум два реална броjа.
У општем случаjу, функциjе g и h могу да буду произвољно сложе-
не, тj., њихово извршавање може да захтева процесорско време или ме-
мориjски простор коjи нису занемарљиви. Имаjући то у виду, може се
54 2 Основни инструменти апстракциjе у програмирању
1 ( define ( f g h x y )
2 ( i f (>= ( g x y ) ( h x y ) )
3 (g x y)
4 (h x y )))
Слика 2.44 Пример функциjе коjа прихвата друге функциjе као улазне аргументе.
> ( f + − 1 2)
3
> ( f + − −1 −2)
1
> ( f maks2 − 1 2 ) ← дефинициjа функциjе maks2 дата jе на сл. 2.17
2
.
ић
Слика 2.45 Илустрациjа извршавања функциjе дефинисане на сл. 2.44.
ов
а.
ат
ан
приметити да ко̂д дат на сл. 2.44 ниjе оптималан, jер се jедна од функ-
циjа g и h (прецизниjе: она функциjа коjа враћа већи резултат кад jоj се
Гњ
ж
саопште броjеви x и y) израчунава два пута — први пут кад се пореде
др
вредности ове две функциjе (линиjа 2. на сл. 2.44), а други пут кад се
ан
за
израчунава повратна вредност функциjе (линиjе 3. или 4. на сл. 2.44). У
ил
ав
пр
Св
а.
• две функциjе g : R2 → R и h : R2 → R,
©
иj
(
g, ако важи g(x, y) ≥ h(x, y) ,
на
1 ( define ( f g h x y )
2 ( i f (>= ( g x y ) ( h x y ) ) g h ) )
Слика 2.46 Пример функциjе коjа као резултат враћа другу функциjу.
а.
врши кроз следеће кораке:
ат
ан
(( f + − 1 2) 3 4 5) ,
Гњ
ж
(+ 3 4 5) , (2.26)
др
ан
12 . за
ил
су
М
а
> ( f + − 1 2)
1.
ав
#<procedure :+>
02
> ( ( f + − 1 2) 3 4 5)
пр
12
–2
> ( f + − −1 −2)
а
20
#<procedure :−>
Св
> ( ( f + − −1 −2) 3 4 5 )
20
−6
а.
иj
#<procedure : maks2>
> ( ( f maks2 − 1 2 ) 3 4 )
рз
4
ве
на
.
Пример 2.18. У примеру 2.3 дефинисана jе функциjа f (x) = x2 , за x ∈ C
ић
(в. сл. 2.4). На сл. 2.48 дефинисана jе еквивалентна безимена функци-
ов
а.
илустровано на сл. 2.50.
ат
ан
Гњ
ж
др
1 (lambda ( x ) ( ∗ x x ) )
ан
за
ил
Слика 2.48 Безимена функциjа коjа прихвата броj x као улазни аргумент, и израчу-
су
нава вредност x2 .
М
а
1.
ав
02
пр
структура дефинициjе
а
Св
и израчунава вредност x2
а.
©
иj
рз
ве
> (lambda ( x ) ( ∗ x x ) )
#<procedure>
на
> ( ( lambda ( x ) ( ∗ x x ) ) 2 )
4
д
> ( ( lambda ( x ) ( ∗ x x ) ) −1 . 5 )
Ра
2.25
> ( ( lambda ( x ) ( ∗ x x ) ) 1+2 i )
−3+4 i
12
Tрадиционални значаj симбола lambda обjашњен jе у 4. поглављу, в. секциjу 4.7.
2.5 Локалне променљиве и лексички опсези 57
1 ( define f 1 (lambda ( x ) ( ∗ x x ) ) )
Пример 2.19. Безимена верзиjа функциjе maks2, коjа прихвата два реал-
.
ић
на броjа, и као резултат враћа већи од њих (в. сл. 2.17, пример 2.8), дата
ов
jе на сл. 2.52. На сл. 2.53, ова безимена функциjа саопштена jе као улазни
а.
аргумент функциjи дефинисаноj на сл. 2.46.
ат
ан
Гњ
ж
др
1 (lambda ( x y ) ( i f (>= x y ) x y ) )
ан
за
Слика 2.52 Безимена функциjа коjа прихвата два реална броjа, и као резултат враћа
ил
су
већи од њих. Функциjа f дефинисана jе на сл. 2.46.
М
а
1.
ав
02
пр
#<procedure>
а
20
4
20
а.
©
> ( define ( f a ) (+ a 1 ) )
> ( define b (+ 3 a ) ) ← променљива a ниjе видљива ван функциjе f
. . . a : undefined ;
ca nn ot r e f e r e n c e an i d e n t i f i e r b e f o r e i t s d e f i n i t i o n
.
ић
Слика 2.54 Лексички опсег улазног аргумента.
ов
а.
ат
ан
Пример 2.21. Имена локалних и глобалних променљивих могу бити иден-
Гњ
ж
тична. Посматраjмо програмски ко̂д дат на сл. 2.55. У 1. линиjи дефи-
др
нисана jе глобална променљива a, чиjи лексички опсег обухвата цели
ан
пр
Св
иj
2
( define ( f a ) (+ a 1 ) )
ве
3 ← локална променљива a
4
5 ( f (+ 3 a ) ) ← референцирање глобалнe променљивe a
д на
Ра
.
Слика 2.56 Идентична имена улазних аргумената различитих функциjа.
ић
ов
а.
ат
ан
Пример 2.23. Посматраjмо програмски ко̂д дат на сл. 2.57, у ком су име-
на x и y придружена двема глобалним и трима локалним променљивама,
Гњ
ж
при чему су референцирања променљивих назначена усмереним лини-
др
jама. Навођењем имена y у телу функциjе f референцира се глобална
ан
за
променљива y, jер у функциjи f ниjе дефинисана локална променљива y
ил
ав
пр
–2
2
Св
4
а.
y ))
©
6
7 ( define ( g x y ) (− x y )) ← локалнe променљивe x и y
рз
8
ве
(f (g y x))
(f (g 3 1))
(f (− 3 1 ) )
(f 2)
(− 2 3)
−1
а.
2.5.1 Локално повезивање
ат
ан
Гњ
ж
У досадашњем разматрању, као примери локалних променљивих на-
др
вођени су искључиво улазни аргументи, а њихови лексички опсези одго-
ан
за
варали су увек телу функциjе. Међутим, програмер може и прецизниjе
ил
ав
пр
Св
20
а.
( let
©
( [ promenljiva−1 izraz−1 ]
иj
[ promenljiva−2 izraz−2 ]
рз
...
[ promenljiva − n i z r a z − n ] )
ве
izraz )
д на
љивих:
promenljiva−1, promenljiva−2, ..., promenljiva−n , (2.28)
коjе се респективно повезуjу с вредностима израза:
> ( l e t ( [ x 1 ] ) (+ x 2 ) )
3
> ( l e t ( [ x 1 ] [ y 2 ] ) (+ x
.
y ))
ић
3
ов
а.
ат
ан
Слика 2.60 Примери паралелног локалног повезивања.
Гњ
ж
др
ан
су
f (a, b, c) = max{a, b, c} − min{a, b, c} , (2.30)
М
за a, b, c ∈ R.
1.
ав
пр
прихвата три реална броjа, и као резултат враћа наjвећи од њих. Аналог-
20
Св
но, могли бисмо дефинисати функциjу коjа прихвата три реална броjа,
20
Ракет:
рз
ћу од њих,
• min — прихвата произвољни броj реалних вредности, и враћа наjмању
на
од њих.
д
Ра
13
У овом контексту, прилошку одредбу „паралелно” треба схватити условно. Она само
означава да ниjе дозвољено да се у изразу за дефинисање вредности неке локалне
променљиве референцира име друге локалне променљиве из истог лексичког опсега.
Међутим, дефинисање локалних променљивих извршава се у редоследу навођења.
14
У 4. поглављу (в. секциjу 4.6) ћемо показати како се дефинишу функциjе коjе
прихватаjу произвољни броj улазних аргумената.
62 2 Основни инструменти апстракциjе у програмирању
1 ( define ( f a b c )
2 ( let
3 ( [ maksimum (max a b c ) ]
4 [ minimum ( min a b c ) ] )
5 (− maksimum minimum ) ) )
.
Слика 2.61 Дефинициjа функциjе (2.30), са локалним променљивама.
ић
ов
а.
ат
ан
1 ( define ( f a b c )
Гњ
ж
2 (− (max a b c ) ( min a b c ) ) )
др
ан
за
Слика 2.62 Дефинициjа функциjе (2.30), без увођења локалних променљивих.
ил
су
М
ав
пута — први пут кад се пореде вредности ове две функциjе (линиjа 2.
02
пр
1 ( define ( f g h x y )
2 ( let
на
3 ( [ gv ( g x y ) ]
4 [ hv ( h x y ) ] )
д
5 ( i f (>= gv hv ) gv hv ) ) )
Ра
( let ∗
( [ promenljiva−1 izraz−1 ]
[ promenljiva−2 izraz−2 ]
...
[ promenljiva − n i z r a z − n ] )
izraz )
.
ић
ов
Слика 2.64 Синтаксичка структура израза за секвенциjално локално повезивање.
а.
ат
ан
Гњ
ж
Пример 2.27. Дефинишимо сигмоидну функциjу:
др
ан
ex за
s(x) = , (2.31)
ex + 1
ил
су
ав
Св
иj
1 ( define ( f x )
рз
2 ( let ∗
ве
3 ( [ b r o j i l a c ( exp x ) ]
4 [ i m e n i l a c (+ b r o j i l a c 1 ) ] )
на
5 (/ b r o j il a c imenilac )))
д
Ра
15
У овом решењу користимо унапред дефинисану функциjу exp коjа прихвата броj x и
израчунава вредност ex — и коjу треба разликовати од унапред дефинисане функциjе
expt представљене у 1. поглављу, в. пример 1.14.
64 2 Основни инструменти апстракциjе у програмирању
а.
опсега, дефинисана у 2. линиjи. У другом случаjу, променљива x дефини-
ат
ан
сана у угнежђеном лексичком опсегу видљива jе приликом дефинисања
Гњ
ж
Последично, вредности израза (а) и (б) се разликуjу — вредности првог
др
израза jеднака jе 2, а другог 3. Референцирања променљивих назначена
ан
су усмереним линиjама.
за
ил
су
М
1 > ( let
а
1.
ав
2 ([ x 1])
3 ( let
02
пр
4 ([ x 2]
–2
5 [ y (+ x 1)]) ← y = 1+1
а
6 y))
20
Св
7 2
20
(а)
а.
©
иj
рз
1 > ( let
2 ([ x 1])
ве
3 ( let ∗
4 ([ x 2]
на
5 [ y (+ x 1)]) ← y = 2+1
6 y))
д
7 3
Ра
(б)
а.
Синтаксичка структура дела израза коjи дефинише улазни аргумент
ат
ан
с подразумеваном вредношћу jе:
Гњ
ж
др
[ ulazni−argument podrazumevana−vrednost] , (2.32)
ан
за
и илустрована jе у следећем примеру.
ил
су
ав
пр
–2
а
20
Св
> (− 1 0 . 9 )
0.09999999999999998
20
> (− 2 1 . 9 )
а.
©
0.10000000000000009
иj
> (= (− 1 0 . 9 ) (− 2 1 . 9 ) )
рз
#f
ве
|x − y| < e . (2.33)
16
Мисли се на функциjе: substring, number−>string и string −>number.
66 2 Основни инструменти апстракциjе у програмирању
1 ( define ( j e d n a k i ? x y [ e 0 . 0 0 0 0 0 1 ] )
2 (< ( abs (− x y ) ) e ) )
.
ић
ов
а.
ат
ан
> ( j e d n a k i ? (− 1 0 . 9 ) (− 2 1 . 9 ) )
#t
Гњ
ж
> ( j e d n a k i ? (− 1 0 . 9 ) (− 2 1 . 9 ) ( e x p t 10 −20 ) )
др
#f
ан
за
ил
а
1.
ав
02
пр
а
20
Св
Пример 2.30. Пример функциjе коjа прихвата два именована улазна ар-
Ра
Слика 2.70 Пример функциjе коjа прихвата два именована улазна аргумента с под-
разумеваним вредностима.
> ( test )
" P r v i argument : a , d r u g i argument : b . "
> ( t e s t #: p r v i " c " )
" P r v i argument : c , d r u g i argument : b . "
> ( t e s t #: d r u g i "d " )
" P r v i argument : a , d r u g i argument : d . "
> ( t e s t #: p r v i " e " #: d r u g i " f " )
" P r v i argument : e , d r u g i argument : f . "
.
ић
> ( t e s t #: d r u g i " e " #: p r v i " f " )
" P r v i argument : f , d r u g i argument : e . "
ов
а.
ат
ан
Слика 2.71 Илустрациjа саопштавања улазних аргумената функциjи дефинисаноj
Гњ
ж
на сл. 2.70.
др
ан
су
М
ав
пр
Св
20
иj
1 ( define ( f x ) (+ 1 ( g x ) ) )
2 ( define ( g x ) ( ∗ 3 ( h x ) ) )
3 ( define ( h x ) ( ∗ x x ) )
4 ( f 2)
а.
ат
ан
ниже адресе ниже адресе ниже адресе
⇑ ⇑ ⇑
Гњ
ж
др
... ... (h 2)
ан
... (g 2) (g 2)
за
ил
( f 2) ( f 2) ( f 2)
су
М
⇓ ⇓ ⇓
1.
ав
пр
Св
⇑ ⇑ ⇑
20
а.
иj
(g 2) ... ...
( f 2) ( f 2) ...
рз
ве
⇓ ⇓ ⇓
више адресе више адресе више адресе
на
Слика 2.74 Илустрациjа стања позивног стека за време извршавања програма датог
на сл. 2.72. Елементи у позивном стеку представљаjу оквире стека коjи одговараjу
позивима функциjа.
2.8 Задаци 69
Библиографскe напоменe:
• Поjмови променљивих и функциjа описани су у секциjи „1.1 The
Elements of Programming”, а поjмови функциjа вишег реда и без-
имених функциjа у секциjи „1.3 Formulating Abstractions with
Higher-Order Procedures” библиографског навода [1].
• Редослед израчунавања вредности у изразима за паралелно и се-
квенциjално локално повезивање размотрен jе у секциjама „5.5
The let special function” и „5.6 The let* special function” библио-
графског навода [31].
.
ић
• Додатни облици израза за локално повезивање описани су у секе-
ов
циjи „4.6 Local Binding” библиографског навода [6].
а.
• Декларисање улазних аргумената с подразумеваним вредности-
ат
ан
ма и именованих улазних аргумената описано jе у секциjама
Гњ
ж
„4.4.2 Declaring Optional Arguments” и „4.4.3 Declaring Keyword
др
Arguments” библиографског навода [6].
ан
а
1.
ав
02
пр
–2
2.8 Задаци
а
20
Св
20
иj
1 ( define ( zapremina a )
на
2 ( i f ( and ( r e a l ? a ) (> a 0 ) )
д
3 ( expt a 3)
Ра
4 0))
( define ( v r s t a − b r o j a x )
( cond
[ ( integer? x) " c e l i broj "]
[ ( rational? x) " racionalni broj "]
[( real? x) " realni broj "]
[ else " kompleksni b r o j " ] ) )
.
ић
Задатак 2.4. Коjа jе вредност израза датог на сл. 2.77? Обjасните.
ов
а.
ат
ан
( let ( [ x 1])
Гњ
ж
( let ( [ x 2]
др
[y x])
ан
(+ x y ) ) ) за
ил
су
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Поглавље 3
Рекурзивне функциjе
.
ић
3.1 Увод
ов
а.
ат
ан
Рекурзиjа спада у централне концепте програмирања. У овом погла-
вљу размотрићемо jедан партикуларни аспект овог концепта — рекурзив-
Гњ
ж
не функциjе. Под рекурзивним функциjама подразумеваjу се функциjе
др
коjе у току свог извршавања позиваjу саме себе, што ћемо у наставку
ан
за
називати рекурзивним позивом. Jедна од наjочигледниjих особина ре-
ил
ав
Св
процеса:
©
иj
• рекурзивни процес и
рз
курзиjом.
Ове две врсте процеса суштински се разликуjу у односу на динамику
на
1
Кад се каже да jе броj обjеката генерисаних рекурзивном функциjом неограничен,
мисли се на чињеницу да дизаjн рекурзивне функциjе не уводи ограничења у погледу
броjа генерисаних обjеката (иако уобичаjено садржи критериjум за престанак гене-
рисања обjеката). С друге стране, броj генерисаних обjеката ограничен jе факторима
окружења у коjима се функциjа извршава, попут капацитета радне мемориjе.
71
72 3 Рекурзивне функциjе
а.
(3.1)
ат
f (1234) = 1 + 2 + 3 + 4 = 10 .
ан
Гњ
ж
Поступак израчунавања може се представити и на следећи начин:
др
ан
f (1234) = 1 + 2 + 3 + 4 за
= (1 + 2 + 3) + 4 (3.2)
ил
су
= f (123) + 4 .
М
Другим речима, збир цифара броjа n = 1234 jеднак jе збиру следећа два
1.
ав
сабирка:
02
пр
цифра,
а
20
Св
тj.:
а.
©
n
f (n) = f (b c) + (n%10), за n ≥ 10 , (3.4)
10
на
где су:
д
n
Ра
f (1234) = f (123) + 4
= ( f (12) + 3) + 4 (3.5)
= (( f (1) + 2) + 3) + 4 .
следећим правилом:
а.
f (n) = n, за 0 ≤ n < 10 . (3.6)
ат
ан
Гњ
ж
зивних позива, и његовом применом завршава се израчунавање jеднако-
др
сти (3.5):
ан
за
ил
f (1234) = f (123) + 4
су
М
= ... (3.7)
а
= (( f (1) + 2) + 3) + 4 = (( 1 + 2) + 3) + 4 = 10 .
1.
ав
02
пр
Св
( n
f (b c) + (n%10), n ≥ 10 ,
20
f (n) = 10 (3.8)
а.
n, n < 10 .
©
иj
циjе кад jоj се саопшти улазни аргумент n = 1234 приказан jе на сл. 3.2.
Функциjа генерише очекивани резултат, али се из овог приказа не види
на
1 ( define ( z b i r n )
2 ( i f (< n 1 0 )
3 n
4 (+ ( z b i r ( q u o t i e n t n 1 0 ) ) ( r e m a i n d e r n 1 0 ) ) ) )
Слика 3.1 Рекурзивна функциjа коjа за дати ненегативни цели броj израчунава збир
његових цифара.
> ( z b i r 1234)
10
Слика 3.2 Резултат позивања функциjе дефинисане на сл. 3.1 кад jоj се саопшти
улазни аргумент n = 1234.
.
ић
( z b i r 1234) ← (а) 1. позив функциjе
ов
(+ ( z b i r 1 2 3 ) 4 ) ← (б) 2. позив функциjе
а.
(+ (+ ( z b i r 1 2 ) 3 ) 4 ) ← (в) 3. позив функциjе
ат
ан
(+ (+ (+ ( z b i r 1 ) 2 ) 3 ) 4 ) ← (г) 4. позив функциjе
(+ (+ (+ 1 2 ) 3 ) 4 ) ← (д) повратак из 4. позива функциjе
Гњ
ж
(+ (+ 3 3 ) 4 ) ← (ђ) повратак из 3. позива функциjе
др
(+ 6 4 ) ← (е) повратак из 2. позива функциjе
ан
су
Слика 3.3 Приказ рекурзивног извршавања функциjе дефинисане на сл. 3.1 кад jоj
М
ав
02
пр
Св
20
иj
рекурзивних позива:
ве
• Стање позивног стека коjе одговара првом позиву функциjе (zbir 1234)
илустровано jе на сл. 3.4(а). У овом позиву, вредност збира (3.9) не мо-
на
• Због тога, врши се други позив функциjе (zbir 123), док jош први
Ра
⇓ ⇓ ⇓ ⇓
више адресе више адресе више адресе више адресе
(а) (б) (в) (г)
а.
ат
ан
... ... ...
Гњ
( zbir 12)
ж
( zbir 123) ( zbir 123) ... ...
др
ан
су
⇓ ⇓ ⇓ ⇓
М
ав
пр
функциjе дефинисане на сл. 3.1 кад jоj се саопшти улазни аргумент n = 1234.
а
20
Св
20
вање функциjе (zbir 1), док jош ниjедан од претходних позива ниjе
иj
• По завршетку позива (zbir 12), оквир коjи одговара овом позиву укла-
ња се из стека (в. сл. 3.4(ђ)), а повратна вредност се прослеђуjе
претходном позиву (zbir 123), што омогућава његово израчунавање
(6 ← (+ 3 3)).
• По завршетку позива (zbir 123), оквир коjи одговара овом позиву
уклања се из стека (в. сл. 3.4(е)), а повратна вредност се прослеђуjе
инициjалном позиву (zbir 1234), што омогућава његово израчунавање
(10 ← (+ 6 4))
• Повратна вредност инициjалног позива представља збир цифара ула-
зног аргумента n = 1234. По завршетку овог позива, одговараjући
оквир се уклања из позивног стека, чиме се позивни стек враћа у стање
у коjем jе био пре инициjалног позива (в. сл. 3.4(ж)).
У општем случаjу, ако се функциjи zbir саопшти ненегативни цели
.
броj n коjи се записуjе с d цифара, можемо закључити следеће:
ић
• Функциjа zbir биће позвана тачно d пута.
ов
а.
• Максимални броj оквира коjи ће се у jедном тренутку налазити у по-
ат
ан
зивном стеку jеднак jе d.
Гњ
ж
У наставку ћемо размотрити како се применом тзв. репне рекурзиjе мо-
др
гу редуковати заузети мемориjски простор на позивном стеку и време
ан
извршавања функциjе. за
Репна рекурзиjа jе специjални тип рекурзиjе у коjем команда коjа се
ил
ав
пр
Св
на сл. 3.4.
а.
©
а.
ат
ан
= 10 ←− примена услова за излазак из рекурзиjе
Гњ
ж
Дефинициjа репно-рекурзивне функциjе zbir−r, коjа имплементира 4
др
ан
циjа враћа очекивани резултат, исто као и функциjа zbir, али да бисмо
су
М
ав
jоj се саопшти улазни аргумент n = 1234 (при чему други улазни ар-
02
пр
Св
а.
©
иj
рз
1 ( define ( z b i r − r n [ a 0 ] )
2 ( i f (< n 1 0 )
ве
3 (+ a n )
4 ( z b i r − r ( q u o t i e n t n 1 0 ) (+ a ( r e m a i n d e r n 1 0 ) ) ) ) )
д на
Слика 3.5 Репно-рекурзивна функциjа коjа за дати ненегативни цели броj израчу-
Ра
Слика 3.6 Резултат позивања функциjе дефинисане на сл. 3.5 кад jоj се саопшти
улазни аргумент n = 1234.
• Функциjа zbir−r биће позвана тачно d пута, исто као и функциjа zbir.
• Приликом сваког репно-рекурзивног позива, оквир стека коjи одговара
функциjи у коjоj jе задат репни позив уклања се из позивног стека,
и замењуjе се оквиром стека коjи одговара функциjи коjа jе репно
позвана. Због тога, броj оквира стека коjи ће се истовремено налазити
у позивном стеку je константан и jеднак 1, за разлику од претходног
.
примера, где jе максимални броj оквира коjи су истовремено смештени
ић
на позивни стек jеднак d (в сл. 3.4 и сл. 3.8). Тиме jе остварена уштеда
ов
а.
ат
ан
Гњ
ж
( zbir−r 1234) ← (а)
1. позив функциjе
др
( zbir−r 123 4 ) ← (б)
2. позив функциjе
ан
( zbir−r 12 7 ) ← (в)
3. позив функциjе
за
( zbir−r 1 9) ← (г)
4. позив функциjе
ил
Слика 3.7 Приказ итеративног извршавања функциjе дефинисане на сл. 3.5 кад jоj
1.
ав
пр
–2
а
20
Св
20
иj
рз
⇓ ⇓ ⇓ ⇓
више адресе више адресе више адресе више адресе
(а) (б) (в) (г)
1 ( define ( b r o j − c i f a r a n )
.
ић
2 ( i f (< n 1 0 )
3 1
ов
а.
4 (+ ( b r o j − c i f a r a ( q u o t i e n t n 1 0 ) ) 1 ) ) )
ат
ан
Гњ
ж
Слика 3.9 Рекурзивна функциjа коjа за дати ненегативни цели броj израчунава броj
његових цифара.
др
ан
за
ил
су
М
1 ( define ( b r o j − c i f a r a − r n [ a 0 ] )
а
2 ( i f (< n 1 0 )
1.
ав
3 (+ a 1 )
02
4 ( b r o j − c i f a r a − r ( q u o t i e n t n 1 0 ) (+ a 1 ) ) ) )
пр
–2
а
20
Слика 3.10 Репно-рекурзивна функциjа коjа за дати ненегативни цели броj израчу-
Св
а.
©
иj
рз
ве
1 ( define ( p r o i z v o d n )
2 ( i f (< n 1 0 )
3 n
4 (∗ ( proizvod ( quotient n 10)) ( remainder n 1 0 ) ) ) )
.
ић
ов
а.
ат
1 ( define ( p r o i z v o d − r n [ a 1 ] )
ан
2 ( i f (< n 1 0 )
Гњ
ж
3 (∗ a n)
4 ( proizvod−r ( q u o t i e n t n 10) (∗ a ( remainder n 1 0 ) ) ) ) )
др
ан
за
Слика 3.12 Неоптимизована репно-рекурзивна функциjа коjа за дати ненегативни
ил
су
цели броj израчунава производ његових цифара.
М
а
1.
ав
ња. У примерима 3.1 и 3.2 било jе неопходно издвоjити све цифре броjа
пр
Св
иj
1 ( define ( proizvod − o n )
2 ( cond
3 [ (< n 1 0 ) n ]
4 [ (= ( r e m a i n d e r n 1 0 ) 0 ) 0 ]
5 [ else
6 ( ∗ ( proizvod − o ( q u o t i e n t n 1 0 ) ) ( r e m a i n d e r n 1 0 ) ) ] ) )
Слика 3.13 Оптимизована рекурзивна функциjа коjа за дати ненегативни цели броj
израчунава производ његових цифара.
1 ( define ( p r o i z v o d − r o n [ a 1 ] )
2 ( cond
3 [ (< n 1 0 ) ( ∗ a n ) ]
4 [ (= ( r e m a i n d e r n 1 0 ) 0 ) 0 ]
5 [ else
.
ић
6 ( proizvod−ro ( q u o t i e n t n 10) (∗ a ( remainder n 1 0 ) ) ) ] ) )
ов
а.
Слика 3.14 Оптимизована репно-рекурзивна функциjа коjа за дати ненегативни це-
ат
ан
ли броj израчунава производ његових цифара.
Гњ
ж
др
3.1). Осим тога, приметан jе и додатни ефекат редуковања времена из-
ан
0.
а
1.
ав
02
24
–2
24
Св
> ( proizvod − o 1 2 3 4 )
20
24
а.
иj
24
рз
0
> ( proizvod−r 1204)
на
0
> ( proizvod − o 1 2 0 4 )
д
0
Ра
Слика 3.15 Резултат позивања функциja дефинисаних на сл. 3.11, 3.12, 3.13 и 3.14
кад им се саопште улазни аргументи n1 = 1234 и n2 = 1204.
82 3 Рекурзивне функциjе
а.
(∗ (∗ (∗ 1 2) 3) 4) ← повратак из 4. позива функциjе
ат
ан
(∗ (∗ 2 3) 4) ← повратак из 3. позива функциjе
Гњ
ж
24 ← повратак из 1. позива функциjе
др
ан
( proizvod−ro 12 1 2 ) 3. позив
← функциjе
су
←
24 ← повратак из 4. позива функциjе
а
1.
ав
02
пр
Слика 3.16 Приказ извршавања функциjа дефинисаних на сл. 3.11, 3.12, 3.13 и 3.14
кад им се саопшти улазни аргумент n1 = 1234.
–2
а
20
Св
финисаних на сл. 3.11, 3.12, 3.13 и 3.14 кад им се саопште улазни аргументи n1 = 1234
и n2 = 1204.
а.
©
иj
на позивном стеку
n1 = 1234 n2 = 1204 n1 = 1234 n2 = 1204
ве
proizvod 4 4 4 4
на
proizvod-r 4 4 1 1
proizvod-o 4 2 4 2
д
proizvod-ro 4 2 1 1
Ра
3.2 Рекурзивно издваjање цифара из целих броjева 83
а.
ат
ан
( proizvod−ro 1204) ← 1. позив функциjе
Гњ
ж
0 ← повратак из 2. позива функциjе
др
ан
за
Слика 3.17 Приказ извршавања функциjа дефинисаних на сл. 3.11, 3.12, 3.13 и 3.14
ил
а
1.
ав
тивно решење.
а
20
Св
20
а.
©
броjу
рз
ве
негативни цели броj n, и генерише броj коjи се добиjе кад се цифре ула-
зног аргумента напишу у обрнутом редоследу.
д
1 ( define ( o k r e n i − b r o j − r n [ a 0 ] )
2 ( i f (< n 1 0 )
3 (+ ( ∗ a 1 0 ) n )
4 ( okreni−broj−r ( quotient n 10)
5 (+ ( ∗ a 1 0 ) ( r e m a i n d e r n 1 0 ) ) ) ) )
.
ић
Слика 3.18 Репно-рекурзивна функциjа коjа генерише броj коjи се добиjе кад се
ов
а.
ат
ан
Гњ
ж
др
> ( okreni−broj−r 4)
ан
4
за
ил
4021
М
321
1.
ав
321
пр
–2
а
20
Слика 3.19 Резултати позивања функциjе дефинисане на сл. 3.18 кад jоj се саопштe
Св
а.
©
иj
рз
ве
5
Проблем коjи захтева очување водећих нула у резултуjућоj вредности посматра се
у задатку 3.3 (у овом поглављу) и примеру 4.19 (у 4. поглављу).
3.3 Рекурзивна обрада монотоних секвенци броjева 85
• све док се први пут не издвоjи цифра c, након чега се прекида секвенца
рекурзивних позива, а функциjа враћа вредност #t,
• или док се не издвоjе и обраде све цифре, што значи да цифра c ниjе
садржана у броjу n, након чега функциjа враћа вредност #f.
Дефинициjа репно-рекурзивне функциjе коjа имплементира ово правило
приказана jе на сл. 3.20. Резултати позивања ове функциjе кад jоj се
саопштe изабрани улазни аргументи приказани су на сл. 3.21.
1 ( define ( s a d r z i ? n c )
2 ( i f (< n 1 0 )
3 ( i f (= n c ) #t #f )
4 ( i f (= ( r e m a i n d e r n 1 0 ) c )
5 #t
6
.
( s a d r z i ? ( quotient n 10) c ) ) ) )
ић
ов
а.
Слика 3.20 Репно-рекурзивна функциjа коjа проверава да ли ненегативни цели броj
ат
ан
n садржи цифру c.
Гњ
ж
др
ан
за
> ( sadrzi? 0 0)
ил
#t
су
М
ав
пр
#f
а
20
Св
20
Слика 3.21 Резултати позивања функциjе дефинисане на сл. 3.20 за изабране улазне
аргументе.
а.
©
иj
рз
ве
а.
ат
ан
при чему jе вредност аргумента a у инициjалном позиву функциjе jеднака
Гњ
ж
1 (тj., jеднака вредности неутралног елемента за операциjу множења).
Рекурзивна функциja коjа имплементира формулу (3.14) представље-
др
на jе на сл. 3.22, а њена репно-рекурзивна верзиjа, коjа имплементира
ан
за
формулу (3.15), на сл. 3.23. Кад упоредимо ове две функциjе у односу
ил
ав
пр
Св
иj
рз
1 ( define ( f a k t o r i j e l n )
2 ( i f (<= n 1 )
ве
3 1
4 ( ∗ n ( f a k t o r i j e l (− n 1 ) ) ) ) )
д на
целог броjа n.
6
Другим речима, ако се функциjи представљеноj на сл. 3.22 саопшти позитивни цели
броj n, максимални броj оквира коjи ће се у jедном тренутку налазити у позивном
стеку jеднак jе n, а ако jоj се саопшти аргумент чиjа jе вредност jеднака 0, у позивни
стек ће бити стављен jедан оквир.
3.3 Рекурзивна обрада монотоних секвенци броjева 87
1 ( define ( f a k t o r i j e l − r n [ a 1 ] )
2 ( i f (<= n 1 )
3 a
4 ( f a k t o r i j e l − r (− n 1 ) ( ∗ n a ) ) ) )
а.
ат
ан
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 . . . (3.16)
Гњ
ж
У општем случаjу, n-ти елемент Фибоначиjевог низа може се представити
др
следећом формулом:
ан
за
ил
0, n = 1,
су
f (n) = 1, n = 2, (3.17)
М
f (n − 1) + f (n − 2), n > 2 .
а
1.
ав
пр
–2
n − 1, n ≤ 2,
(3.18)
а
f (n) =
20
f (n − 1) + f (n − 2), n>2.
Св
20
на сл. 3.24. Резултат позивања ове функциjе кад jоj се саопшти улазни
иj
( fib 6) (3.19)
развиjе у
(+ (fib 5) ( fib 4))) (3.20)
(в. 2. линиjу на сл. 3.26), прво се у потпуности извршава позив ( fib 5) (в.
линиjе 3.–15.), и тек потом се прелази на извршавање позива ( fib 4) (в.
линиjе 16.–22.). Важно jе приметити да претпоставка о редоследу изра-
88 3 Рекурзивне функциjе
1 ( define ( f i b n )
2 ( i f (<= n 2 )
3 (− n 1 )
4 (+ ( f i b (− n 1 ) ) ( f i b (− n 2 ) ) ) ) )
Слика 3.24 Рекурзивна функциjа коjа израчунава n-ти елемент Фибоначиjевог низа.
.
ић
> ( f i b 6)
ов
5
а.
ат
ан
Слика 3.25 Резултат позивања функциjе дефинисане на сл. 3.24 кад jоj се саопшти
Гњ
ж
улазни аргумент n = 6.
др
ан
за
Приказ извршавања функциjе дат на сл. 3.26 може се посматрати као
ил
ав
Св
вршавања (в. сл. 3.27) и стварног поступка извршавања (в. сл. 3.26).
На концептуалном нивоу, односи између позива функциjе су хиjерархиj-
ве
1 ( f i b 6)
2 (+ (fib 5) (fib 4) )
3 (+ (+ ( f i b 4 ) ( f i b 3 ) ) ( f i b 4 ) )
4 (+ (+ (+ ( f i b 3 ) ( f i b 2 ) ) ( f i b 3 ) ) ( f i b 4 ) )
5 (+ (+ (+ (+ ( f i b 2 ) ( f i b 1 ) ) ( f i b 2 ) ) ( f i b 3 ) ) ( f i b 4 ) )
6 (+ (+ (+ (+ 1 ( f i b 1 ) ) ( f i b 2 ) ) ( f i b 3 ) ) ( f i b 4 ) )
7 (+ (+ (+ (+ 1 0 ) ( f i b 2 ) ) ( f i b 3 ) ) ( f i b 4 ) )
8 (+ (+ (+ 1 ( f i b 2 ) ) ( f i b 3 ) ) ( f i b 4 ) )
9 (+ (+ (+ 1 1 ) ( f i b 3 ) ) ( f i b 4 ) )
10 (+ (+ 2 ( f i b 3 ) ) ( f i b 4 ) )
11 (+ (+ 2 (+ ( f i b 2 ) ( f i b 1 ) ) ) ( f i b 4 ) )
12 (+ (+ 2 (+ 1 ( f i b 1 ) ) ) ( f i b 4 ) )
13 (+ (+ 2 (+ 1 0 ) ) ( f i b 4 ) )
14 (+ (+ 2 1 ) ( f i b 4 ) )
15 (+ 3 (fib 4) )
16 (+ 3 (+ ( f i b 3 ) ( f i b 2 ) ) )
.
ић
17 (+ 3 (+ (+ ( f i b 2 ) ( f i b 1 ) ) ( f i b 2 ) ) )
18 (+ 3 (+ (+ 1 ( f i b 1 ) ) ( f i b 2 ) ) )
ов
19 (+ 3 (+ (+ 1 0 ) ( f i b 2 ) ) )
а.
20 (+ 3 (+ 1 ( f i b 2 ) ) )
ат
ан
21 (+ 3 (+ 1 1 ) )
Гњ
22 (+ 3 2 )
ж
23 5
др
ан
за
ил
Слика 3.26 Приказ рекурзивног извршавања функциjе дефинисане на сл. 3.24 кад
су
jоj се саопшти улазни аргумент n = 6.
М
(fib 6)
1.
ав
02
пр
(fib 5) (fib 4)
–2
а
20
Св
а.
©
(fib 2) (fib 1)
ве
(fib 6)
(fib 5) (fib 4)
(fib 2) (fib 1)
а.
• за сваки прелаз „одоздо-нагоре”, тj., са чвора f j на његовог директног
ат
ан
претка fi , из позивног стека уклања се оквир коjи одговара позиву
Гњ
ж
др
Резултуjућа секвенца стања позивног стека приказана jе на сл. 3.29.
ан
су
ав
пр
Св
• ( fib 6) jеданпут,
20
• ( fib 5) jеданпут,
а.
иj
аргументи из скупа {1, 2, . . . , 40} (в. задатак 3.6). Подаци из ове табеле
графички су приказани на сл. 3.30. Mоже se уочити експоненциjални раст
броjа рекурзивних позива c(n) у односу на вредност улазног аргумента
n, што ову функциjу чини неефикасном.
7
В. броj чворова у хиjерархиjи рекурзивних позива на сл. 3.27.
3.3 Рекурзивна обрада монотоних секвенци броjева 91
а.
( fib 3) ( fib 3) ( fib 3) ( fib 3) ( fib 3)
( fib 5) ( fib 5) ... ( fib 4) ( fib 4) ( fib 4) ( fib 4) ( fib 4)
ат
ан
( fib 6) ( fib 6) ( fib 6) ( fib 6) ( fib 6) ( fib 6) ( fib 6) ( fib 6)
... ... ... ... ... ... ... ...
Гњ
ж
(17) (18) (19) (20) (21) (22) (23) (24)
др
ан
ав
02
Св
20
·108
1.5
c(n)
0.5
0
.
ић
0 10 20 30 40
ов
а.
n
ат
ан
Слика 3.30 Експоненциjални раст броja рекурзивних позива функциjе дефинисане
Гњ
ж
др
ан
за
Да бисмо превазишли оваj проблем, дефинисаћемо репно-рекурзивну
ил
циjу ове функциjе укључићемо два додатна улазна аргумента коjа памте
М
ав
пр
Св
иj
a1 , n = 1,
f (n, a2 , a1 ) = a2 , n = 2, (3.21)
рз
f (n − 1, a1 + a2 , a2 ), n > 2 ,
ве
нисана jе на сл. 3.31. Резултат позивања ове функциjе кад jоj се саопшти
улазни аргумент n = 6 приказан jе на сл. 3.32, а секвенца рекурзивних
позива извршених у поступку израчунавања резултата на сл. 3.33. Функ-
циjа се не позива вишеструко за исте улазне аргументе, а укупни броj
позива jеднак jе 5.
У општем случаjу, за улазни аргумент n ≥ 2:
3.3 Рекурзивна обрада монотоних секвенци броjева 93
1 ( define ( f i b − r n [ a2 1 ] [ a1 0 ] )
2 ( cond
3 [ (= n 1 ) a1 ]
4 [ (= n 2 ) a2 ]
5 [ e l s e ( f i b − r (− n 1 ) (+ a2 a1 ) a2 ) ] ) )
.
ић
Слика 3.31 Репно-рекурзивна функциjа коjа израчунава n-ти елемент Фибоначиjе-
вог низа.
ов
а.
ат
ан
Гњ
ж
др
> ( fib−r 6)
5
ан
за
ил
су
Слика 3.32 Резултат позивања функциjе дефинисане на сл. 3.31 кад jоj се саопшти
М
улазни аргумент n = 6.
а
1.
ав
02
пр
–2
1 ( fib−r 6)
а
20
2 ( fib−r 5 1 1)
Св
3 ( fib−r 4 2 1)
20
4 ( fib−r 3 3 2)
а.
©
5 ( fib−r 2 5 3)
иj
6 5
рз
ве
Слика 3.33 Приказ итеративног извршавања функциjе дефинисане на сл. 3.31 кад
jоj се саопшти улазни аргумент n = 6.
д на
Ра
n = pq , (3.22)
а.
• У супротном, за n ≥ 2, из секвенце (3.23) рекурзивно се издваjаjу бро-
ат
ан
jеви, од наjмањег ка наjвећем:
Гњ
ж
– све док се први пут не издвоjи броj коjи jе делилац броjа n, што зна-
др
чи да броj n ниjе прост, након чега се издваjање броjева из секвенце
ан
су
њих ниjе делилац броjа n, што значи да jе броj n прост, након чега
М
ав
вило приказана jе на сл. 3.34. Резултати позивања ове функциjе кад jоj
пр
–2
Св
20
а.
1 ( define ( p r o s t ? n [ a 2 ] )
©
иj
2 ( cond
3 [ (= n 1 ) #f ]
рз
4 [ (> ( ∗ a a ) n ) #t ]
ве
5 [ (= ( r e m a i n d e r n a ) 0 ) #f ]
6 [ e l s e ( p r o s t ? n (+ a 1 ) ) ] ) )
д на
прост.
Слика 3.35 Резултати позивања функциjе дефинисане на сл. 3.34 кад jоj се саопште
изабрани улазни аргументи.
( prost? 31)
( prost? 31 3 )
( prost? 31 4 )
( prost? 31 5 )
( prost? 31 6 )
#t
.
ић
( prost? 15)
( p r o s t ? 15 3 )
ов
а.
#f
ат
ан
Гњ
ж
Слика 3.36 Приказ итеративног извршавања функциjе дефинисане на сл. 3.34 кад
jоj се саопште изабрани улазни аргументи.
др
ан
за
√
ил
а
1.
(3.24)
ав
2, 3, . . . , 23, 24 ,
02
пр
иj
( prost? 1)
.
ић
#f
ов
( prost? 31)
а.
( prost − pom? 31)
ат
ан
( prost − pom? 31 3 )
Гњ
ж
( prost − pom? 31 4 )
( prost − pom? 31 5 )
др
( prost − pom? 31 6 )
ан
#t
за
ил
( prost? 15)
су
М
( prost − pom? 1 5 )
( prost − pom? 15 3 )
а
1.
ав
#f
02
пр
–2
Св
20
а.
иj
а.
ат
ан
Слика 3.39 Друга верзиjа оптимизоване функциjе коjа проверава да ли jе природни
броj n прост.
Гњ
ж
др
ан
за
ил
су
М
ав
пр
иj
• све док се први пут не издвоjи броj a коjи jе делилац броjа n, након чега
рз
њих ниjе делилац броjа n, што значи да jе броj n прост, након чега
функциjа враћа вредност n.
д
Ра
8
У програмском jезику Ракет постоjи више дозвољених синтаксичких структура де-
финициjе локалне функциjе. На сл. 3.39 примењена jе jедна од њих.
9
На истом принципу дефинишу се и локалне променљиве, в. секциjу 2.5 у 2. поглављу.
98 3 Рекурзивне функциjе
1 ( define ( n a j m a n j i − d e l i l a c n [ a 2 ] )
2 ( cond
3 [ (> ( ∗ a a ) n ) n ]
4 [ (= ( r e m a i n d e r n a ) 0 ) a ]
5 [ e l s e ( n a j m a n j i − d e l i l a c n (+ a 1 ) ) ] ) )
Слика 3.40 Репно-рекурзивна функциjа коjа одређуjе наjмањи прости делилац при-
родног броjа n, већег од 1.
( najmanji−delilac 31)
( najmanji−delilac 31 3 )
( najmanji−delilac 31 4 )
( najmanji−delilac 31 5 )
( najmanji−delilac 31 6 )
31
.
ић
( najmanji−delilac 15)
ов
( n a j m a n j i − d e l i l a c 15 3 )
а.
3
ат
ан
Гњ
ж
Слика 3.41 Приказ итеративног извршавања функциjе дефинисане на сл. 3.40 кад
др
jоj се саопште изабрани улазни аргументи.
ан
за
ил
су
а
1.
ав
Св
иj
Библиографскe напоменe:
• Рекурзивне функциjе у програмском jезику Ским размотрене су
у секциjи „1.2 Procedures and the Processes They Generate” библи-
ографског навода [1].
• Разлике између рекурзивних и итеративних процеса размотрене
су у секциjи „5.1 Designing Register Machines” библиографског на-
вода [1].
.
ић
ов
а.
ат
ан
3.5 Задаци
Гњ
ж
др
Задатак 3.1. Kо̂дови приказани на сл. 3.1 и 3.2 имплементираjу рекур-
ан
за
зивне функциjе коjе израчунаваjу збир цифара датог ненегативног целог
ил
помоћне функциjе.)
а
1.
ав
пр
Св
а) рекурзивног процеса,
20
иj
10
Дефинисање итеративних процеса применом петљи размотрено jе у 6. поглављу.
100 3 Рекурзивне функциjе
а) рекурзивног процеса,
а.
ат
ан
Гњ
ж
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Поглавље 4
Рекурзивне структуре података
.
ић
4.1 Увод
ов
а.
ат
ан
У претходном поглављу размотрен jе jедан аспект рекурзиjе — ре-
курзивне функциjе. У овом поглављу посматра се други важни аспект
Гњ
ж
овог концепта — рекурзивне структуре података. За разлику од атом-
др
ских типова података, коjи су до сад били у фокусу пажње, рекурзивне
ан
за
структуре података инхерентно су сложене, тj., представљаjу компози-
ил
ав
пр
–2
а
20
а.
иj
елемент пара,
• други показивач садржи мемориjску адресу на коjоj се налази други
елемент пара,
1
У овом поглављу, показивач ћемо посматрати као мемориjску адресу на коjоj се
налази неки програмски обjекат. Поjам показивача ће бити детаљниjе размотрен у 5.
поглављу.
101
102 4 Рекурзивне структуре података
x2
Слика 4.1 Интерно
представљање уређеног
пара у рачунарскоj мемо- x1
риjи.
а.
ат
ан
> ( cons 1 2 )
’ (1 . 2)
Гњ
ж
др
ан
су
М
ра, тj., пара коjи садржи само први елемент, док jе други елемент неде-
1.
ав
пр
а
20
Св
null
представљање уређеног
а.
©
ги елемент недефинисан.
ве
на
Слика 4.4 Конструисање уређеног пара у коjем jе само први елемент дефинисан.
а.
ат
ан
а њено интерно представљање у радноj мемориjи илустровано jе на сл.
4.5. Оваква секвенца рекурзивно угнежђених парова назива се листом.
Гњ
ж
Сваки елемент листе, осим последњег, представљен jе уређеним паром у
др
коjем:
ан
за
• први показивач садржи мемориjску адресу на коjоj се налази елемент
ил
листе,
су
М
ав
02
а
20
Св
20
null
а.
©
иj
рз
x1 x2 xi xn−1 xn
ве
Слика 4.5 Интерно представљање листе као секвенце рекурзивно угнежђених паро-
ва.
д на
тj., елементи листе се наводе у облим заградама, при чему се испред отво-
рене заграде наводи апостроф. Елементи у листи одваjаjу се празнинама.
104 4 Рекурзивне структуре података
> ( cons 1
( cons 2
( cons 3
.
( cons 4 n u l l ) ) ) )
ић
’ (1 2 3 4)
ов
а.
ат
Слика 4.6 Дефинисање листе броjева ’(1 2 3 4) као секвенце рекурзивно угнежђе-
ан
них парова.
Гњ
ж
др
ан
за
ил
> ( l i s t 1 2 3 4)
су
’ (1 2 3 4)
М
а
1.
ав
пр
–2
а
20
Св
20
null
а.
©
иj
рз
1 2 3 4
ве
> ( l i s t ( l i s t 1 " a " ) ( l i s t 2 ) #t )
’ ( ( 1 " a " ) ( 2 ) #t )
Слика 4.9 Дефинисање листе броjева ’((1 "a") (2) #t) позивањем функциjе list.
.
ић
ов
а.
ат
ан
null
Гњ
ж
др
ан
null null #t
за
ил
су
М
1 ”a” 2
а
1.
ав
пр
–2
а
20
Св
20
иj
4.11.
Ра
.
ић
> ( define l i s t a ’ (1 2 3 4))
ов
а.
> ( car l i s t a )
ат
ан
> ( cdr l i s t a )
Гњ
ж
’ (2 3 4)
др
ан
су
М
а
1.
ав
> ( car l i s t a )
пр
4
–2
> ( cdr l i s t a )
а
20
’ ()
Св
20
а.
Слика 4.13 Резултат извршавања функциjа car и cdr кад им се саопшти листа коjа
©
ментом дато на сл. 4.3, треба приметити да се симболичко име null може
на
а.
Пример 4.8. У табели 4.1 приказане су повратне вредности предиката
ат
ан
кад им се саопште изабрани улазни аргументи. На овом примеру могу се
Гњ
ж
др
• Листа ниjе специjални случаj уређеног пара: Свака непразна листа
ан
уређени пар.
су
форме — празна листа (null) или уређени пар чиjи jе други елемент
1.
ав
пр
пар:
–2
Св
а.
иj
jесте листа (в. табелу 4.1), jер jе други елемент наjугнежђениjег пара
рз
pair? #t #t #t #t #f
cons? #t #t #t #t #f
list? #f #f #t #t #t
empty? #f #f #f #f #t
null? #f #f #f #f #t
.
ић
ов
а.
ат
ан
Функциjа append прихвата произвољни броj листи, и генерише листу
Гњ
ж
коjа садржи елементе свих саопштених листи, у редоследу навођења. По-
др
ред тога, дозвољено jе да последњи аргумент коjи се саопшти функциjи
ан
Пример 4.9. Резултати позивања функциjе append кад jоj се саопште иза-
а
ав
02
пр
–2
Св
20
Пример 4.10. Резултати позивања функциjе length кад jоj се саопште иза-
ве
> ( append ’ ( 1 2 3 ) ’ ( 4 5 ) 6 )
’ (1 2 3 4 5 . 6)
> ( l i s t ? ( append ’ ( 1 2 3 ) ’ ( 4 5 ) 6 ) )
#f
> ( p a i r ? ( append ’ ( 1 2 3 ) ’ ( 4 5 ) 6 ) )
#t
> ( append 1 )
.
ић
1
> ( number? ( append 1 ) )
ов
#t
а.
ат
ан
Гњ
Слика 4.15 Резултати позивања функциjе append кад jоj се саопште изабрани аргу-
ж
менти.
др
ан
> ( length ’ ( 1 2 3 4 ) )
за
ил
4
су
> ( length ’ ( ( 1 2 ) 3 4 ) )
М
3
а
ав
2
02
> ( length ’ ( ) )
пр
0
–2
. . . length : c o n t r a c t v i o l a t i o n
Св
expected : l i s t ?
20
given : 1
а.
©
иj
Слика 4.16 Резултати позивања функциjе length кад jоj се саопште изабрани аргу-
рз
менти.
ве
на
1 ( define ( d u z i n a l )
2 ( i f ( empty? l )
3 0
4 (+ 1 ( d u z i n a ( cdr l ) ) ) ) )
.
ић
Слика 4.17 Рекурзивна функциjа коjа израчунава броj елемената у листи.
ов
а.
ат
ан
Гњ
ж
др
> ( duzina ’ (1 2 3 4))
ан
4
за
> ( duzina ’ ((1 2) 3 4))
ил
3
су
> ( d u z i n a ( car ’ ( ( 1 2 ) 3 4 ) ) )
М
2
а
> ( duzina ’ ( ) )
1.
ав
0
02
пр
. . . cdr : c o n t r a c t v i o l a t i o n
а
expected : pair?
20
Св
given : 1
20
а.
©
Слика 4.18 Резултати позивања функциjе дефинисане на сл. 4.17 кад jоj се саопште
иj
Слика 4.19 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.17 кад
jоj се саопшти изабрани улазни аргумент.
а.
снован на правилу (4.11) приказана jе на сл. 4.20. Резултати позивања ове
ат
ан
функциjе кад jоj се саопштe изабрани улазни аргументи jеднаки су ре-
Гњ
ж
зултатима позивања претходно дефинисане функциjе коjа имплементира
др
рекурзивни процес — в. сл. 4.18 — и нису приказани засебно. Међутим,
ан
су
М
1 ( define ( duzina − r l [ a 0 ] )
1.
ав
2 ( i f ( empty? l )
02
3 a
пр
4 ( duzina − r ( cdr l ) (+ a 1 ) ) ) )
–2
а
20
Св
а.
©
иj
рз
2 ( duzina − r ’ (3 4) 1)
3 ( duzina − r ’ (4) 2)
на
4 ( duzina − r ’ ( ) 3)
5 3
д
Ра
Слика 4.21 Приказ итеративног извршавања функциjе дефинисане на сл. 4.20 кад
jоj се саопшти изабрани улазни аргумент.
112 4 Рекурзивне структуре података
Пример 4.12. Резултати позивања функциjе list-ref кад jоj се саопште иза-
брани аргументи приказани су на сл. 4.22.
> ( list−ref ’ ((1 2) 3 4) 0)
.
ић
’ (1 2)
> ( list−ref ’ ((1 2) 3 4) 1)
ов
а.
3
ат
ан
4
Гњ
ж
> ( list−ref ’ ((1 2) 3 4) 3) ← индекс ван опсега листе
. . . list−ref : index too l a r g e f o r l i s t
др
index : 3
ан
in : ’ ((1 2) 3 4)
за
ил
су
М
Слика 4.22 Резултати позивања функциjе list-ref кад jоj се саопште изабрани аргу-
а
менти.
1.
ав
02
пр
–2
Св
мент, тj. у листи (cdr l). На основу тога, можемо формулисати следеће
ве
репно-рекурзивно правило:
на
(car l),
n=0,
f (l, n) = (4.12)
f ((cdr l), n − 1), n > 0 .
д
Ра
1 ( define ( i n d e k s l n )
2 ( i f (= n 0 )
3 ( car l )
4 ( i n d e k s ( cdr l ) (− n 1 ) ) ) )
Слика 4.23 Репно-рекурзивна функциjа коjа враћа елемент листе l коjем jе додељен
индекс n.
> ( indeks ’ ((1 2) 3 4) 0)
’ (1 2)
> ( indeks ’ ((1 2) 3 4) 1)
3
> ( indeks ’ ((1 2) 3 4) 2)
4
> ( indeks ’ ((1 2) 3 4) 3) ← индекс ван опсега листе
.
ић
. . car : c o n t r a c t violation
expected : pair?
ов
а.
given : ’ ()
ат
ан
Гњ
ж
Слика 4.24 Резултати позивања функциjе дефинисане на сл. 4.23 кад jоj се саопште
изабрани улазни аргументи.
др
ан
1 ( indeks ’ ((1 2) 3 4) 2)
за
ил
2 ( indeks ’ (3 4) 1)
су
3 ( indeks ’ (4) 0)
М
4 4
а
1.
ав
02
Слика 4.25 Приказ итеративног извршавања функциjе дефинисане на сл. 4.23 кад
пр
а
20
Св
20
иj
Пример 4.14. Резултати позивања функциjе take кад jоj се саопште иза-
брани аргументи приказани су на сл. 4.26.
д на
ни цели броj k, и враћа нову листу коjа садржи првих k елемената листе
l.
И у овом примеру ћемо размотрити два решења, тj., дефинисаћемо
две функциjе коjе респективно имплементираjу рекурзивни и итератив-
ни процес израчунавања тражених резултата. У првом решењу посма-
трамо рекурзивни процес. Ако jе вредност улазног аргумента k jеднака
0, функциjа треба да генерише празну листу — empty. У супротном, ако
114 4 Рекурзивне структуре података
> ( take ’ ( ( 1 2 ) 3 4 ) 0 )
’ ()
> ( take ’ ( ( 1 2 ) 3 4 ) 1 )
’ ((1 2))
> ( take ’ ( ( 1 2 ) 3 4 ) 2 )
’ ((1 2) 3)
> ( take ’ ( ( 1 2 ) 3 4 ) 3 )
’ ((1 2) 3 4)
> ( take ’ ( ( 1 2 ) 3 4 ) 4 ) ← вредност k ван опсега листе
. . . take : c o n t r a c t v i o l a t i o n
e x p e c t e d : a l i s t with a t l e a s t 4 e l e m e n t s
given : ’ ((1 2) 3 4)
Слика 4.26 Резултати позивања функциjе take кад jоj се саопште изабрани аргу-
менти.
.
ић
ов
а.
ат
елемената:
ан
’(e0 , e1 , ..., en−1 ) , (4.13)
Гњ
ж
др
где jе n ≥ 1, може се представити уређеним паром6 у коjем jе:
ан
тj.:
1.
ав
02
(4.14)
пр
| {z } |{z} | {z }
(cdr l ) 1. елемент (cdr l )
а
20
Св
| {z }
пара 2. елемент пара
20
empty, k=0.
на
1 ( define ( p r e f i k s l k )
2 ( i f (= k 0 )
3 empty
4 ( cons ( car l ) ( p r e f i k s ( cdr l ) (− k 1 ) ) ) ) )
Слика 4.27 Рекурзивна функциjа коjа прихвата листу l и ненегативни цели броj k,
и враћа нову листу коjа садржи првих n елемената листе k.
> ( p r e f i k s ’ ((1 2) 3 4) 0)
’ ()
> ( p r e f i k s ’ ((1 2) 3 4) 1)
’ ((1 2))
> ( p r e f i k s ’ ((1 2) 3 4) 2)
’ ((1 2) 3)
> ( p r e f i k s ’ ((1 2) 3 4) 3)
.
ић
’ ((1 2) 3 4)
> ( p r e f i k s ’ ((1 2) 3 4) 4) ← вредност k ван опсега листе
ов
а.
. . . car : c o n t r a c t v i o l a t i o n
ат
expected : pair?
ан
given : ’ ()
Гњ
ж
др
Слика 4.28 Резултати позивања функциjе дефинисане на сл. 4.27 кад jоj се саопште
ан
су
1 ( p r e f i k s ’ ((1 2) 3 4) 2)
М
2 ( cons ’ ( 1 2 ) ( p r e f i k s ’ ( 3 4 ) 1 ) )
а
3 ( cons ’ ( 1 2 ) ( cons 3 ( p r e f i k s ’ ( 4 ) 0 ) ) )
1.
ав
пр
5 ( cons ’ ( 1 2 ) ’ ( 3 ) )
6 ’ ((1 2) 3)
–2
а
20
Св
Слика 4.29 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.27 кад
20
иj
рз
| {z } | {z }
д
листа l листа a
(4.16)
Ра
1
.
( define ( p r e f i k s − r l k [ l 1 empty ] )
ић
2 ( i f (= k 0 )
ов
3 l1
а.
4 ( p r e f i k s − r ( cdr l ) (− k 1 ) ( append l 1 ( l i s t ( car l ) ) ) ) ) )
ат
ан
Гњ
ж
Слика 4.30 Репно-рекурзивна функциjа коjа прихвата листу l и ненегативни цели
др
броj k, и враћа нову листу коjа садржи првих n елемената листе k.
ан
за
ил
су
М
1 ( prefiks−r ’ ((1 2) 3 4) 2)
а
2 ( prefiks−r ’ (3 4) 1 ’ ((1 2 ) ) )
1.
ав
пр
4 ’ ((1 2) 3)
–2
а
20
Св
Слика 4.31 Приказ итеративног извршавања функциjе дефинисане на сл. 4.30 кад
jоj се саопшти изабрани улазни аргумент.
20
а.
©
иj
1 ( p r e f i k s ’ (1 2 3 4 5) 3) ← рекурзивни процес
2 ( cons 1 ( p r e f i k s ’ ( 2 3 4 5 ) 2 ) )
3 ( cons 1 ( cons 2 ( p r e f i k s ’ ( 3 4 5 ) 1 ) ) )
4 ( cons 1 ( cons 2 ( cons 3 ( p r e f i k s ’ ( 4 5 ) 0 ) ) ) )
5 ( cons 1 ( cons 2 ( cons 3 empty ) ) )
6 ( cons 1 ( cons 2 ’(3) ) )
7 ( cons 1 ’(2 3) )
8 ’(1 2 3)
9
10 ( p r e f i k s − r ’ ( 1 2 3 4 5 ) 3 empty ) ← итеративни процес
11 ( p r e f i k s − r ’ ( 2 3 4 5 ) 2 ’(1) )
12 ( p r e f i k s − r ’ ( 3 4 5 ) 1 ’(1 2) )
13 ( p r e f i k s − r ’ ( 4 5 ) 0 ’(1 2 3) )
14 ’(1 2 3)
.
ић
Слика 4.32 Упоредни приказ генерисања резултуjуће листе у рекурзивном процесу
дефинисаном на сл. 4.27, и итеративном процесу дефинисаном на сл. 4.30, за изабране
ов
а.
улазне аргументе.
ат
ан
Гњ
ж
4.4.5 Суфикс листе
др
ан
Пример 4.16. Резултати позивања функциjе drop кад jоj се саопште иза-
а
ав
02
пр
–2
> ( drop ’ ( ( 1 2 ) 3 4 ) 0 )
а
’ ((1 2) 3 4)
20
Св
> ( drop ’ ( ( 1 2 ) 3 4 ) 1 )
20
’ (3 4)
а.
> ( drop ’ ( ( 1 2 ) 3 4 ) 2 )
©
’ (4)
иj
> ( drop ’ ( ( 1 2 ) 3 4 ) 3 )
рз
’ ()
> ( drop ’ ( ( 1 2 ) 3 4 ) 4 ) ← вредност k ван опсега листе
ве
. . . drop : c o n t r a c t v i o l a t i o n
e x p e c t e d : a l i s t with a t l e a s t 4 e l e m e n t s
на
given : ’ ((1 2) 3 4)
д
Ра
Слика 4.33 Резултати позивања функциjе drop кад jоj се саопште изабрани аргу-
менти.
1 ( define ( s u f i k s l k )
а.
2 ( i f (= k 0 )
ат
ан
3 l
Гњ
ж
4 ( s u f i k s ( cdr l ) (− k 1 ) ) ) )
др
ан
Слика 4.34 Рекурзивна функциjа коjа прихвата листу l и ненегативни цели броj k,
за
и враћа листу коjа се добиjе кад се из улазне листе уклони првих k елемената.
ил
су
М
а
1.
ав
02
> ( s u f i k s ’ ((1 2) 3 4) 0)
пр
’ ((1 2) 3 4)
–2
> ( s u f i k s ’ ((1 2) 3 4) 1)
а
20
’ (3 4)
Св
> ( s u f i k s ’ ((1 2) 3 4) 2)
20
’ (4)
а.
> ( s u f i k s ’ ((1 2) 3 4) 3)
©
’ ()
иj
. . cdr : c o n t r a c t violation
ве
expected : pair?
given : ’ ()
д на
Слика 4.35 Резултати позивања функциjе дефинисане на сл. 4.34 кад jоj се саопште
Ра
1 ( s u f i k s ’ ((1 2) 3 4) 2)
2 ( s u f i k s ’ (3 4) 1)
3 ( s u f i k s ’ (4) 0)
4 ’ (4)
Слика 4.36 Приказ итеративног извршавања функциjе дефинисане на сл. 4.34 кад
jоj се саопштe изабрани улазни аргументи.
.
Пример 4.18. Резултати позивања функциjе reverse кад jоj се саопште
ић
изабрани аргументи приказани су на сл. 4.37. Може се приметити да
ов
а.
ат
ан
Гњ
ж
> ( r e v e r s e ’ (1 2 3 4))
др
’ (4 3 2 1)
> ( reverse ’ ())
ан
’ ()
за
ил
> ( r e v e r s e ’ (1 (2 3) 4))
су
а
1.
ав
Слика 4.37 Резултати позивања функциjе reverse кад jоj се саопште изабрани аргу-
02
менти.
пр
–2
а
20
Св
угнежђеним листама.
иj
• листe коjа се генерише обртањем редоследа елемената листе ’(e1 , ..., en−1 )
а.
ат
ан
• с листом коjа садржи само први елемент улазне листе l — ’(e0 ),
Гњ
ж
тj.:
др
ан
за
f (’ ( e0 , e1 , ..., en−1 )) = (append f (’ (e1 , ..., en−1 )) ’( e0 ) ) . (4.22)
ил
| {z } | {z } | {z }
су
l (cdr l) (list (car l))
М
ав
f (l) =
Св
(4.23)
а.
©
иj
1 ( define ( o k r e n i l )
2 ( cond
3 [ ( empty? l ) empty ]
4 [ e l s e ( append ( o k r e n i ( cdr l ) ) ( l i s t ( car l ) ) ) ] ) )
Слика 4.38 Непотпуна рекурзивна функциjа коjа обрће редослед елемената у листи.
4.4 Изабране основне функциjе над листама 121
> ( okreni ’ (1 2 3 4))
’ (4 3 2 1)
> ( okreni ’ ())
’ ()
> ( okreni ’ (1 (2 3) 4))
’ (4 (2 3) 1) ← редослед елемената у листи ’(2 3) jе непромењен
Слика 4.39 Резултати позивања функциjе дефинисане на сл. 4.38 кад jоj се саопште
изабрани улазни аргументи.
1 ( okreni ’ (1 (2 3) 4))
2 ( append ( o k r e n i ’ ( ( 2 3 ) 4 ) ) ’ ( 1 ) )
3 ( append ( append ( o k r e n i ’ ( 4 ) ) ’ ( ( 2 3 ) ) ) ’ ( 1 ) )
4 ( append ( append ( append ( o k r e n i ’ ( ) ) ’ ( 4 ) ) ’ ( ( 2 3 ) ) ) ’ ( 1 ) )
5 ( append ( append ( append ’ ( ) ’ ( 4 ) ) ’ ( ( 2 3 ) ) ) ’ ( 1 ) )
.
ић
6 ( append ( append ’ ( 4 ) ’ ( ( 2 3 ) ) ) ’ ( 1 ) )
7 ( append ’ ( 4 ( 2 3 ) ) ’ ( 1 ) )
ов
а.
8 ’ (4 (2 3) 1)
ат
ан
Гњ
ж
Слика 4.40 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.38 кад
jоj се саопшти изабрани улазни аргумент.
др
ан
за
ил
ав
а
20
иj
f (l) = (append f ((cdr l)) (list f ((car l)))), ако jе (car l) листа ,
empty, ако jе l празна листа .
на
(4.24)
д
Ра
1 ( define ( o k r e n i l )
2 ( cond
3 [ ( empty? l ) empty ]
4 [ ( l i s t ? ( car l ) ) ( append ( o k r e n i ( cdr l ) )
5 ( l i s t ( o k r e n i ( car l ) ) ) ) ]
6 [ e l s e ( append ( o k r e n i ( cdr l ) ) ( l i s t ( car l ) ) ) ] ) )
.
ић
Слика 4.41 Рекурзивна функциjа коjа обрће редослед елемената у листи — и свим
ов
угнежђеним листама.
а.
ат
ан
Гњ
ж
др
> ( okreni ’ (1 2 3 4))
ан
’ (4 3 2 1)
за
> ( okreni ’ ())
ил
’ ()
су
’ (4 (3 2) 1)
а
ав
’ (6 (5 (4 3) 2) 1)
02
пр
–2
Слика 4.42 Резултати позивања функциjе дефинисане на сл. 4.41 кад jоj се саопште
а
20
Св
а.
©
1 ( okreni ’ (1 (2 3) 4))
2 ( append ( okreni ’ ((2 3) 4)) ’ ( 1 ) )
3 ( append ( append ( o k r e n i ’ ( 4 ) ) ( l i s t ( o k r e n i ’ ( 2 3 ) ) ) ) ’ ( 1 ) )
4 ( append ( append ( append ( o k r e n i ’ ( ) ) ’ ( 4 ) )
5 ( l i s t ( okreni ’ (2 3 ) ) ) ) ’ ( 1 ) )
6 ( append ( append ( append ’ ( ) ’ ( 4 ) )
7 ( l i s t ( okreni ’ (2 3 ) ) ) ) ’ ( 1 ) )
8 ( append ( append ’ ( 4 ) ( l i s t ( o k r e n i ’ ( 2 3 ) ) ) ) ’ ( 1 ) )
9 ( append ( append ’ ( 4 ) ( l i s t ( append ( o k r e n i ’ ( 3 ) ) ’ ( 2 ) ) ) ) ’ ( 1 ) )
10 ( append ( append ’ ( 4 ) ( l i s t ( append ( append
11 ( okreni ’ ()) ’ (3)) ’ (2)))) ’ (1))
12 ( append ( append ’ ( 4 ) ( l i s t ( append ( append
13 ’ () ’ (3)) ’ (2)))) ’ (1))
14 ( append ( append ’ ( 4 ) ( l i s t ( append ’ ( 3 ) ’ ( 2 ) ) ) ) ’ ( 1 ) )
15 ( append ( append ’ ( 4 ) ( l i s t ’ ( 3 2 ) ) ) ’ ( 1 ) )
16 ( append ( append ’ ( 4 ) ’ ( ( 3 2 ) ) ) ’ ( 1 ) )
.
ић
17 ( append ’ ( 4 ( 3 2 ) ) ’ ( 1 ) )
18 ’ (4 (3 2) 1)
ов
а.
ат
ан
Слика 4.43 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.41 кад
jоj се саопшти изабрани улазни аргумент.
Гњ
ж
др
ан
сл. 4.45.
а
1.
ав
02
пр
1 ( define ( o k r e n i − r l [ a empty ] )
–2
2 ( cond
а
3 [ ( empty? l ) a ]
20
Св
4 [ ( l i s t ? ( car l ) )
5 ( o k r e n i − r ( cdr l ) ( cons ( o k r e n i − r ( car l ) ) a ) ) ]
20
иj
рз
1 ( okreni−r ’ (1 (2 3) 4))
2 ( okreni−r ’ ((2 3) 4) ’ ( 1 ) )
3 ( okreni−r ’ ( 4 ) ( cons ( o k r e n i − r ’ ( 2 3 ) ) ’ ( 1 ) ) )
4 ( okreni−r ’ ( 4 ) ( cons ( o k r e n i − r ’ ( 3 ) ’ ( 2 ) ) ’ ( 1 ) ) )
5 ( okreni−r ’ ( 4 ) ( cons ( o k r e n i − r ’ ( ) ’ ( 3 2 ) ) ’ ( 1 ) ) )
6 ( okreni−r ’ ( 4 ) ( cons ’ ( 3 2 ) ’ ( 1 ) ) )
7 ( okreni−r ’ (4) ’ ((3 2) 1))
8 ( okreni−r ’ ( ) ’ (4 (3 2) 1))
9 ’ (4 (3 2) 1)
Слика 4.45 Приказ итеративног извршавања функциjе дефинисане на сл. 4.44 кад
jоj се саопшти изабрани улазни аргумент.
а.
ат
3.1 у 3. поглављу),
ан
• обртања редоследа елемената у листи (в. пример 4.19 у овом погла-
Гњ
ж
вљу).
др
Због тога су у наставку представљена решења, без разматрања поступка
ан
за
њиховог извођења8 .
ил
ав
ако jе e0 броj ,
пр
| {z }
(cdr l)
а
e0 ) + f (’ (e1 , ..., en−1 )), ако jе e0 листа ,
20
| {z } | {z }
20
(car l)
(cdr l)
l
у супротном .
f (’ (e1 , ..., en−1 )),
а.
©
иj
| {z }
(cdr l)
(4.25)
рз
ве
8
Читаоцу се оставља да интерпретира дата правила.
4.5 Изабране функциjе вишег реда над листама 125
1 ( define ( z b i r l )
2 ( cond
3 [ ( empty? l ) 0 ]
4 [ ( number? ( car l ) ) (+ ( car l ) ( z b i r ( cdr l ) ) ) ]
5 [ ( l i s t ? ( car l ) ) (+ ( z b i r ( car l ) ) ( z b i r ( cdr l ) ) ) ]
6 [ e l s e ( z b i r ( cdr l ) ) ] ) )
Слика 4.46 Рекурзивна функциjа коjа израчунава збир броjева садржаних у листи.
> ( zbir ’ ( " a " "b" " c " ) )
0
> ( zbir ’ (1 2 3 4))
10
> ( zbir ’ ( 1 " a " 2 #t 3 "b" 4 ) )
10
.
ић
> ( zbir ’ ( ( 1 ( " a " 2 ) #t ) 3 ( " b" 4 ) ) )
10
ов
а.
ат
ан
Слика 4.47 Резултати позивања функциjе дефинисане на сл. 4.46 кад jоj се саопште
Гњ
ж
изабрани улазни аргументи.
др
ан
a,
за l jе празна листа,
ил
f (’ (e1 , ..., en−1 ), a + e0 ), e0 jе броj ,
су
М
| {z } |{z}
(cdr l) (car l)
а
f (’ (e0 , e1 , ..., en−1 ), a) = f (’ (e 1 , ..., en−1 ), a + f ( e0 )), e0 jе листа ,
1.
ав
| {z } | {z } |{z}
02
(car l)
(cdr l)
l
пр
у супротном ,
f (’ (e1 , ..., en−1 )),
–2
| {z }
а
(cdr l)
20
Св
(4.26)
20
циjе jеднака 0.
©
иj
1 ( z b i r ’ ( ( 1 (" a" 2 ) ) 3 ) )
2 (+ ( z b i r ’ ( 1 ( " a " 2 ) ) ) ( z b i r ’ ( 3 ) ) )
3 (+ (+ 1 ( z b i r ’ ( ( " a " 2 ) ) ) ) ( z b i r ’ ( 3 ) ) )
4 (+ (+ 1 (+ ( z b i r ’ ( " a " 2 ) ) ( z b i r ’ ( ) ) ) ) ( z b i r ’ ( 3 ) ) )
5 (+ (+ 1 (+ ( z b i r ’ ( 2 ) ) ( z b i r ’ ( ) ) ) ) ( z b i r ’ ( 3 ) ) )
6 (+ (+ 1 (+ (+ 2 ( z b i r ’ ( ) ) ) ( z b i r ’ ( ) ) ) ) ( z b i r ’ ( 3 ) ) )
7 (+ (+ 1 (+ (+ 2 0 ) ( z b i r ’ ( ) ) ) ) ( z b i r ’ ( 3 ) ) )
8 (+ (+ 1 (+ 2 ( z b i r ’ ( ) ) ) ) ( z b i r ’ ( 3 ) ) )
9 (+ (+ 1 (+ 2 0 ) ) ( z b i r ’ ( 3 ) ) )
10 (+ (+ 1 2 ) ( z b i r ’ ( 3 ) ) )
11 (+ 3 ( z b i r ’ ( 3 ) ) )
12 (+ 3 (+ 3 ( z b i r ’ ( ) ) ) )
13 (+ 3 (+ 3 0 ) )
14 (+ 3 3 )
15 6
.
ић
Слика 4.48 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.46 кад
ов
jоj се саопшти изабрани улазни аргумент.
а.
ат
ан
1 ( define ( z b i r − r l [ a 0 ] )
Гњ
ж
2 ( cond
3 [ ( empty? l ) a ]
др
4 [ ( number? ( car l ) ) ( z b i r − r ( cdr l ) (+ a ( car l ) ) ) ]
ан
5
за
[ ( l i s t ? ( car l ) ) ( z b i r − r ( cdr l ) (+ a ( z b i r − r ( car l ) ) ) ) ]
6 [ e l s e ( z b i r − r ( cdr l ) a ) ] ) )
ил
су
М
листи.
ав
02
пр
Св
5 ( zbir−r ’ ( 3 ) (+ 0 ( zbir−r ’ ( ) (+ 1 ( z b i r − r ’ ( 2 ) 0 ) ) ) ) )
а.
6 ( zbir−r ’ ( 3 ) (+ 0 ( zbir−r ’ ( ) (+ 1 ( z b i r − r ’ ( ) 2 ) ) ) ) )
©
7 ( zbir−r ’ ( 3 ) (+ 0 ( zbir−r ’ ( ) (+ 1 2 ) ) ) )
иj
9 ( zbir−r ’ ( 3 ) (+ 0 3))
10 ( zbir−r ’ (3) 3)
ве
11 ( zbir−r ’ ( ) 6)
12 6
д на
Ра
Слика 4.50 Приказ итеративног извршавања функциjе дефинисане на сл. 4.49 кад
jоj се саопшти изабрани улазни аргумент.
4.5 Изабране функциjе вишег реда над листама 127
а.
Пример 4.21. Резултати позивања функциjе map кад jоj се саопште иза-
ат
ан
брани аргументи приказани су на сл. 4.51.
Гњ
ж
др
ан
су
ав
> (map + l 1 l 2 )
02
пр
’ ( 6 8 10 1 2 ) ← сабирање листи l1 и l2
–2
> (map + l 1 l 2 l 2 )
а
20
’ ( 1 1 14 17 2 0 ) ← сабирање листи l1 , l2 и l2
Св
20
а.
©
Слика 4.51 Резултати позивања функциjе map кад jоj се саопште изабрани аргу-
иj
менти.
рз
ве
f (p, ’( e0 , e1 , ..., en−1 )) = (cons (p e0 ) f (p, ’(e1 , ..., en−1 ))) . (4.28)
| {z } | {z }
(cdr l ) (cdr l )
а.
ат
1 ( define ( m a p i r a j f l )
ан
2 ( i f ( empty? l )
Гњ
ж
3 empty
др
4 ( cons ( f ( car l ) ) ( m a p i r a j f ( cdr l ) ) ) ) )
ан
за
ил
а
1.
ав
02
пр
> ( m a p i r a j (lambda ( x ) (+ x 1 ) ) ’ ( 1 2 3 4 ) )
–2
’ (2 3 4 5)
а
20
’ ( #t #f #t )
20
а.
©
иj
Слика 4.53 Резултати позивања функциjе дефинисане на сл. 4.52 кад jоj се саопште
изабрани улазни аргументи.
рз
ве
10
Слично правило за итеративни процес изведено jе у примеру 4.15 у овом поглављу.
4.5 Изабране функциjе вишег реда над листама 129
Слика 4.54 Приказ рекурзивног извршавања функциjе дефинисане на сл. 4.52 кад
jоj се саопште изабрани улазни аргументи.
.
ић
Кад се издвоjе сви елементи из улазне листе, извршавање функциjе се
ов
а.
завршава, а функциjа враћа помоћну листу a као резултат. Ово правило
ат
ан
може се формулисати:
Гњ
ж
f (p, (cdr l), (append a (list (p (car l))))), l ниjе празна листа ,
др
f (p, l, a) =
a, l jе празна листа ,
ан
(4.31)
за
ил
(4.31) приказана jе на сл. 4.55. Резултати позивања ове функциjе кад jоj
1.
ав
пр
а.
©
2 ( i f ( empty? l )
рз
3 a
4 ( mapiraj − r p ( cdr l ) ( append a ( l i s t ( p ( car l ) ) ) ) ) ) )
ве
на
.
Слика 4.56 Приказ итеративног извршавања функциjе дефинисане на сл. 4.55 кад
ић
jоj се саопште изабрани улазни аргументи.
ов
а.
ат
ан
4.5.2 Филтрирање листе
Гњ
ж
др
Функциjа filter прихвата функциjу p и листу l, и генерише листу коjа
ан
Пример 4.23. Резултати позивања функциjе filter кад jоj се саопште иза-
а
ав
02
пр
–2
Св
> ( f i l t e r (lambda ( x ) (= ( r e m a i n d e r x 2 ) 1 ) ) l )
иj
Слика 4.57 Резултати позивања функциjе filter кад jоj се саопште изабрани аргу-
менти.
д на
Ра
11
В. задатак 4.4.
4.5 Изабране функциjе вишег реда над листама 131
1 ( define ( f i l t r i r a j p l [ a empty ] )
2 ( cond
3 [ ( empty? l ) a ]
4 [ ( p ( car l ) ) ( f i l t r i r a j p ( cdr l )
5 ( append a ( l i s t ( car l ) ) ) ) ]
6 [ e l s e ( f i l t r i r a j p ( cdr l ) a ) ] ) )
Слика 4.58 Функциjа коjа прихвата функциjу p и листу l , и генерише листу коjа
садржи оне елементе из листе l за коjе функциjа p генерише вредност #t, у редоследу
у ком су наведени у улазноj листи.
.
ић
ов
а.
ат
ан
> ( define l ’ ( 1 7 56 109 22 4 9 ) ) ← улазнa листа
Гњ
ж
др
> ( f i l t r i r a j (lambda ( x ) (> x 5 0 ) ) l )
’ (56 109) ← издвоjени су броjеви већи од 50
ан
за
ил
> ( f i l t r i r a j (lambda ( x ) (= ( r e m a i n d e r x 2 ) 1 ) ) l )
су
а
1.
ав
Слика 4.59 Резултати позивања функциjе дефинисане на сл. 4.58 кад jоj се саопште
02
а
20
Св
20
а.
©
#f, у супротном.
Да би се листа l уредила, функциjа p се примењуjе на сваку вариjациjу
два елемента ei и e j . Друга два улазна аргумента су именовани аргументи
с подразумеваним вредностима12 :
12
Именовани аргументи с подразумеваним вредностима обjашњени су у 2. поглављу,
в. секциjу 2.6.
132 4 Рекурзивне структуре података
а.
Именованим аргументима #:keys и #:cache − keys? додељене су респек-
ат
ан
тивно следеће подразумеване вредности: (lambda (x) x) и #f.
Гњ
ж
Пример 4.25. Резултати позивања функциjе sort кад jоj се саопште иза-
др
брани аргументи приказани су на сл. 4.60. Треба приметити да функциjа
ан
случаjа:
су
М
• ако важи:
а
1.
ав
пр
–2
листи,
20
Св
• ако важи:
20
а.
©
Нпр., три позива функциjе sort на сл. 4.60 уређуjу дату улазну листу тако
на
а.
> ( sort l (lambda ( x y )
ат
ан
( and (= ( r e m a i n d e r x 2 ) 0 )
Гњ
(= ( r e m a i n d e r y 2 ) 1 ) ) ) )
ж
’ ( 5 6 22 49 109 1 7 ) ← парни броjеви претходе непарним, при чему jе
др
редослед парних броjева исти као у улазноj листи
ан
за
> ( sort l (lambda ( x y )
ил
(= ( r e m a i n d e r x 2 ) 0 ) ) )
су
М
1.
ав
02
пр
Слика 4.60 Резултати позивања функциjе sort кад jоj се саопште изабрани аргумен-
–2
ти.
а
20
Св
20
иj
(= (p e c) #t) , (4.35)
(= (p e c) #f) . (4.36)
134 4 Рекурзивне структуре података
1 ( define ( u r e d i l p )
.
ић
2 ( cond
ов
3 [ ( empty? l ) empty ]
а.
4 [ else ( let ∗
ат
ан
5 ( [ c ( car l ) ]
Гњ
6 [ l 1 ( f i l t e r (lambda ( e ) ( p e c ) ) ( cdr l ) ) ]
ж
7 [ l 2 ( f i l t e r (lambda ( e ) ( not ( p e c ) ) ) ( cdr l ) ) ] )
др
8 ( append ( u r e d i l 1 p )
ан
9 ( list c) за
10 ( uredi l2 p ) ) ) ] ) )
ил
су
М
Слика 4.61 Функциjа коjа прихвата листу l и функциjу p, и генерише нову листу
а
ав
02
пр
–2
а
20
Св
20
аргумената
©
иj
рз
Први елемент ове синтаксичке структуре чини симбол lambda, други еле-
Ра
> ( u r e d i l <)
’ ( 1 7 22 49 56 1 0 9 )
> ( u r e d i l (lambda ( x y )
(< ( r e m a i n d e r x 1 0 ) ( r e m a i n d e r y 1 0 ) ) ) )
’ ( 2 2 56 17 49 1 0 9 )
> ( u r e d i l (lambda ( x y )
(<= ( r e m a i n d e r x 1 0 ) ( r e m a i n d e r y 1 0 ) ) ) )
’ ( 2 2 56 17 109 4 9 )
> ( u r e d i l (lambda ( x y )
( and (= ( r e m a i n d e r x 2 ) 0 )
(= ( r e m a i n d e r y 2 ) 1 ) ) ) )
.
ић
’ ( 5 6 22 49 109 1 7 )
ов
> ( u r e d i l (lambda ( x y )
а.
(= ( r e m a i n d e r x 2 ) 0 ) ) )
ат
ан
’ ( 2 2 56 49 109 1 7 )
Гњ
ж
др
Слика 4.62 Резултати позивања функциjе дефинисане на сл. 4.61 кад jоj се саопште
ан
су
’ ( 22 19 109 56 47 1 7 )
М
’ ( 19 17) ’ ( 22 ) ’ ( 109 56 4 7 )
1.
ав
02
’ ( 17 ) ’ ( 19 ) ’ ( ) ’ ( 56 47) ’ ( 109 ) ’ ()
пр
–2
’ ( 47 ) ’ ( 56 ) ’ ( )
а
20
Св
20
’ ( 17 19 22 47 56 109 )
а.
©
иj
рз
што њен други елемент чини само jедан улазни аргумент, коjи ниjе на-
Ра
1 ( define s a b e r i
2 (lambda l ( z b i r l ) ) )
Слика 4.64 Функциjа коjа прихвата произвољно дугачку секвенцу аргумената про-
извољних типова података, и израчунава збир свих броjева садржаних у њоj.
.
ић
ов
а.
ат
> ( s a b e r i 1 2 3 4)
ан
10
Гњ
ж
> ( s a b e r i 1 2 3 4 5 6)
21
др
> ( s a b e r i 1 " a " 2 #t 3 "b" 4 )
ан
10
за
ил
10
1.
ав
0
пр
–2
Слика 4.65 Резултати позивања функциjе дефинисане на сл. 4.64 кад jоj се саопште
20
Св
а.
©
иj
Слика 4.66 Функциjа коjа прихвата произвољни низ броjева, и израчунава њихов
збир.
> ( maksimum 1 5 7 3 )
7
> ( maksimum 1 5 7 3 12 0 )
.
ић
12
> ( maksimum 1 234 +i n f . 0 1 0 2 4 )
ов
а.
+i n f . 0
ат
ан
. . . maksimum : a r i t y mismatch ;
Гњ
ж
t h e e x p e c t e d number o f arguments d o e s not match
t h e g i v e n number
др
expected : at l e a s t 1
ан
given : 0
за
ил
су
М
Слика 4.67 Резултати позивања функциjе дефинисане на сл. 4.66 кад jоj се саопште
а
ав
02
пр
а
20
Св
зику Лисп изворно биле интерно представљане као листе, и jедино што
jе разликовало функциjе од „стандардних” листи било jе то што jе први
на
13
Важност листи у функционалном програмирању рефлектуjе се и кроз чињеницу да
име програмског jезика Лисп представља композитну реч насталу сажимањем фразе
„List Processor”.
138 4 Рекурзивне структуре података
Библиографскe напоменe:
• Интерно мемориjско представљање уређених парова и листи раз-
мотрено jе у поглављу „2 Lists” библиографског навода [31].
• Опсежниjи списак унапред дефинисаних функциjа над листама у
програмском jезику Ракет дат jе у секциjи „4.10 Pairs and Lists”
библиографског навода [6].
• Дефинисање функциjа за обраду листи размотрено jе у секциjи
„2.3 Lists, Iteration, and Recursion” библиографског навода [6].
• Алгоритам за брзо уређење секвенци описан jе у библиографском
наводу [13].
• Имплементациjа упрошћене верзиjе алгоритма за брзо уређивање
листе — коjа претпоставља да улазна листа садржи само разли-
.
ић
чите броjеве, и уређуjе листу растуће — дата jе у секциjи „25.2
Recursion that Ignores Structure” библиографског навода [5].
ов
а.
• Примена симбола lambda за дефинисање функциjа коjе при-
ат
ан
хватаjу произвољни броj аргумената описана jе у секциjи „4.4.1
Declaring a Rest Argument” библиографског навода [6].
Гњ
ж
• Етимолошко порекло композитних речи „Lisp”, „car” и „cdr” обjа-
др
шњено jе у секциjи „2.10 Car and Cdr” библиографског навода [31],
ан
за
и секциjи „LISP prehistory — Summer 1956 through Summer 1958”
ил
ав
02
пр
–2
а
20
Св
4.8 Задаци
20
а.
©
пример 4.20.)
на
а.
• броjеви претходе стринговима,
ат
ан
• броjеви су уређени монотоно неопадаjуће,
Гњ
ж
• стрингови су лексикографски уређени монотоно неопадаjуће.
др
ан
за
ил
су
М
а
1.
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
програмирања
Концепти императивног
Део II
©
20
20
–2
02
Ра 1.
д М
на ил
ве ан
рз Гњ
иj ат
а.
Св ов
а ић
.
пр
ав
а
су
за
др
ж
ан
а.
Поглавље 5
Типови података и инструменти
апстракциjе у императивноj
парадигми
.
ић
5.1 Увод
ов
а.
ат
ан
У овом поглављу размотрени су атомски типови података и изабрани
инструменти апстракциjе у програмском jезику Ц, укључуjући: промен-
Гњ
ж
љиве, функциjе, условно извршавање, низове и показиваче. Иако jе ве-
др
ћина ових концепата већ обрађена у контексту функционалне парадигме
ан
за
програмирања, фокус разматрања у овом поглављу стављен jе на оне
ил
програмски jезик Ц.
М
ав
Св
иj
143
144 5 Типови података и инструменти апстракциjе у императивноj парадигми
а.
ат
ан
Гњ
ж
др
Атомски тип података Примери константи
ан
ав
02
пр
Св
jезик Ц:
а.
©
а.
зани су у табели 5.2. Сви наведени оператори су бинарни, тj., примењуjу
ат
ан
се над два операнда, осим оператора негациjе (!), коjи jе унаран, тj., при-
Гњ
ж
мењуjе се над jедним операндом.
др
ан
за
Табела 5.2 Оператори коjи извршаваjу основне операциjе над константама у про-
ил
грамском jезику Ц. Сви наведени оператори су бинарни, осим оператора негациjе (!),
су
коjи jе унаран.
М
Категориjа Оператори
1.
ав
оператора
02
пр
релациони: jеднако (==), различито (! =), мање (<), мање или jеднако
Св
иj
рз
ња (−), множења (∗) и дељења (/) зависе од врсте броjева над коjима
су оператори примењени. Нпр., резултат сабирања целих броjева такође
на
jе цели броj. Ако jе бар jедан сабирак реални броj, тада jе и резултат
д
2
Разлика између низова симбола и стрингова обjашњена jе у секциjи 5.5.1 и илустро-
вана у примеру 5.26.
146 5 Типови података и инструменти апстракциjе у императивноj парадигми
а.
ат
ан
Гњ
ж
1 1 / 2; ← израчуната вредност jеднака jе целом броjу 0
др
2 99 / 1 0 0 ; ← израчуната вредност jеднака jе целом броjу 0
3 1.0 / 2; ← израчуната вредност jеднака jе реалном броjу 0,5
ан
4 99.0 / 100;
за
← израчуната вредност jеднака jе реалном броjу 0,99
ил
су
М
ав
02
пр
–2
чиво над два цела броjа, и враћа остатак целоброjног дељења првог броjа
20
Св
другим.
20
датог целог броjа добиjа као остатак његовог целоброjног дељења броjем
ве
а.
• оператор >= генерише буловску вредност тачно ако jе вредност првог
ат
ан
броjа већа од или jеднака вредности другог броjа, односно буловску
Гњ
ж
вредност нетачно, у супротном.
др
Пример 5.4. Примена релационих оператора илустрована jе на сл. 5.4.
ан
за
ил
су
ав
пр
Св
20
иj
рз
а.
се оптимизовало извршавање наредбе, друга компонента израза се не
ат
ан
израчунава. Слично, у наредби:
Гњ
ж
( 2 > 3 ) && ( 1 != 2 ) ;
др
ан
израза се не израчунава.
а
1.
ав
02
пр
–2
5.3 Променљиве
а
20
Св
int x1 , x2 ;
double y ;
3
Различити програмски jезици имаjу различите дефинициjе валидних имена про-
грамских ентитета, попут променљивих, функциjа, итд. Нпр., програмски jезик Ц
осетљив jе на величину слова, тj., имена променљивих „br” и „Br” сматраjу се разли-
читим.
5.3 Променљиве 149
... ...
Слика 5.6 Интерна ре- ... y 2.71 y
презентациjа декларисања ... ...
и инициjализовања про- ... x2 2 x2
менљивих.
... ...
... x1 1 x1
. ... ...
ић
ов
⇓ ⇓
а.
више адресе више адресе
ат
ан
(а) (б)
Гњ
ж
др
ан
су
x1 = 1 ;
М
x2 = x1 + 1 ;
а
1.
y = 2.71;
ав
02
пр
Св
иj
4
Може се приметити да су променљиве коjе су декларисане раниjе у изворном ко̂ду
смештене у мемориjским локациjама на вишим адресама, што рефлектуjе начин на
д
коjи се локалне променљиве смештаjу у позивни стек (в. секциjу 2.7 у 2. поглављу).
Ра
int x1 = 1 ;
int x2 = x1 + 1 ;
int y = 2 . 7 1 ;
а.
што jе илустровано на сл. 5.7. За оператор додељивања (=) се каже да jе
ат
ан
десно асоциjативан, због смера прослеђивања вредности подизраза наве-
Гњ
ж
деног с десне стране оператора.
др
ан
за
ime_promenljive = izraz;
ил
додељивања подизраза
1.
ав
променљивоj
02
пр
–2
Св
x1 = x2 = x3 = 1 ;
иj
рз
интерпретира се као:
ве
x1 = ( x2 = ( x3 = 1 ) ) ;
на
а.
нака увећаноj (не почетноj) вредности променљиве x.
ат
ан
Пример 5.9. Разлика између префиксне и суфиксне примене оператора
Гњ
ж
++ постаjе уочљивиjа у комбинациjи с оператором додељивања. Резултат
др
извршавања наредбе:
ан
за
y = x++;
ил
су
y = x;
1.
ав
x = x + 1;
02
пр
y = ++x ;
20
Св
20
x = x + 1;
иj
y = x;
рз
1 int x , y ;
2 x = 1;
3 y = x++; ← вредност y jеднака jе 1; вредност x jеднака jе 2
4
5 x = 1;
6 y = ++x ; ← вредност y jеднака jе 2; вредност x jеднака jе 2
7
8 x = 1;
9 y = x −−; ← вредност y jеднака jе 1; вредност x jеднака jе 0
10
11 x = 1;
12 y = −−x ; ← вредност y jеднака jе 0; вредност x jеднака jе 0
.
ић
• експлицитне конверзиjе, коjе програмер задаjе експлицитним навође-
ов
а.
ат
ан
ног захтева од стране програмера.
Гњ
ж
др
Други критериjум се односи на губитак прецизности с коjом jе конвер-
ан
су
ав
пр
прецизности.
а
20
Св
иj
double r = 2 ;
рз
изворну вредност.
Међутим, у наредби:
int c = 2 . 7 1 ;
реални броj 2, 71 додељуjе се променљивоj коjа jе декларисана као цели
броj. Да би се ова наредба реализовала, извршава се имплицитно кон-
вертовање реалног броjа 2, 7 у цели броj 2, занемаривањем децималног
5.3 Променљиве 153
а.
1 int a = 1 ;
ат
2 int b = 2 ;
ан
3 double c = ( a + b ) / 2 ; ← променљивоj c додељуjе се вредност 1, 0
Гњ
ж
др
Слика 5.10 Пример некоректног израчунавања просечне вредности два цела броjа.
ан
за
ил
су
Ако желимо да се променљивоj c додели вредност коjа одговара сред-
М
ав
пр
–2
1 int a = 1 ;
20
Св
2 int b = 2 ;
20
3 double c ;
а.
5
иj
7
8 c = ( a + b ) / 2.0 ; ← променљивоj c додељуjе се вредност 1, 5
ве
9
10 именилац jе наведен као реални броj
д на
Ра
Слика 5.11 Примери коректног израчунавања просечне вредности два цела броjа.
7
Зависност резултата примене оператора дељења од врсте броjева над коjима jе опе-
ратор примењен обjашњена jе у примеру 5.2.
154 5 Типови података и инструменти апстракциjе у императивноj парадигми
а.
но, а ако се наредба return ипак наведе, не прослеђуjе jоj се повратна
ат
ан
вредност.
Гњ
ж
Пример 5.12. Дефинишимо функциjу коjа прихвата реални броj x, и ге-
др
нерише вредност x2 , тj.:
ан
за
f (x) = x2 , x ∈ R . (5.2)
ил
су
ав
02
пр
1 double f ( double x ) {
–2
2 return x ∗ x ;
а
3 }
20
Св
20
иj
рз
5.14, при чему jе део наредбе коjи почиње резервисаном речjу else опцион.
Ова наредба се извршава на очекивани начин: ако jе вредност буловског
на
наредба.
Ра
double f ( double x) {
return x * x;
}
а.
else
ат
ан
naredba2
Гњ
ж
др
Слика 5.14 Синтаксичка структура наредбе условног извршавања.
ан
за
ил
ав
пр
а
20
Св
2 i f (a > b)
а.
3 return a ;
©
4
иj
else
5 return b ;
рз
6 }
ве
Слика 5.15 Дефинициja функциje коjа прихвата два реална броjа, и као резултат
на
а.
7 else
ат
ан
8 i f (b > c )
9 return b ;
Гњ
ж
10 else
др
11 return c ;
ан
12 } за
ил
су
Слика 5.16 Дефинициja функциje коjа прихвата три реална броjа, и као резултат
М
ав
02
примеру 5.13), коjа прихвата два броjа, и као резултат враћа већи од
а
20
Св
иj
рз
Слика 5.17 Друга дефинициja функциje коjа прихвата три реална броjа, и као ре-
Ра
x % y == 0. (5.5)
а.
5 return 1 ;
ат
ан
6 else
7 return 0 ;
Гњ
ж
8 }
др
ан
за
Слика 5.18 Дефинициja функциje коjа проверава дељивост jедног целог броjа дру-
ил
ав
казано на сл. 5.19, при чему се примењуjе само jедна наредба условног
02
пр
Св
20
иj
Слика 5.19 Друга дефинициja функциje коjа проверава дељивост jедног целог броjа
другим целим броjем.
.
ић
ов
а.
ат
ан
(==) примењен оператор доделе (=):
Гњ
ж
др
(x = 1).
ан
за
Оваj израз садржи, у ствари, операциjу додељивања вредности 1 про-
ил
пр
2.
а
20
Св
20
1 int x = 0 ;
а.
©
2 int y ;
иj
3 i f ( x = 1)
рз
4 y = 2;
5 else
ве
9
Ово jе размотрено у 1. поглављу (в. пример 1.3) и 2. поглављу (в. примерe 2.6 и
2.10).
10
Десна асоциjативност оператора додељивања обjашњена jе у секциjи 5.3 овог по-
главља.
5.5 Низови 159
5.5 Низови
а.
сивних мемориjских блокова11 за смештање елемената низа a. Сваком
ат
ан
елементу низа додељуjе се индекс коjи означава позициjу елемента у ни-
Гњ
ж
зу. Првом елементу низа додељуjе се индекс 0, другом елементу индекс
др
1, итд. (в. сл. 5.22(а)).
ан
a[ i ]. (5.8)
су
М
ав
Св
иj
1 int a [ 1 2 ] ;
на
2 a [ 0 ] = 3;
д
3 a [ 2 ] = 1;
Ра
11
За сваки елемент низа одваjа се по jедан мемориjски блок. Сви блокови су jеднаких
величина.
160 5 Типови података и инструменти апстракциjе у императивноj парадигми
⇓
.
⇓ ⇓
ић
више адресе више адресе више адресе
ов
а.
(а) (б) (в)
ат
ан
Слика 5.22 Илустрациjа стања у мемориjи релевантних за примере (а,б) 5.17 и (в)
Гњ
ж
5.18.
др
ан
int a [ 1 2 ] = { 3 , 8 , 1 , 7 , 6 , 4 , 9 , 2 , 5 , 8 , 0 , 1 } ;
а
ав
пр
Св
20
а.
0 1 2 3 4 5 6 7 8 9 10 11
©
иj
h i
a= 3 8 1 7 6 4 9 2 5 8 0 1
рз
ве
0 1 2 3
0 3 8 1 7
m = 1
6 4 9 2
2 5 8 0 1
.
ић
m [2][1] m [1][2] m [0][3]
ов
а.
ат
ан
Гњ
ж
Међутим, иако се декларациjе jеднодимензионалног низа приказаног
др
на сл. 5.23 и дводимензионалног низа приказаног на сл. 5.24 формално
ан
за
разликуjу, важно jе приметити да су оба низа интерно представљена на
ил
на сл. 5.22(в).
а
1.
ав
пр
0 1 ... N −1
–2
···
а
Св
m= . .. .. .. .. ,
.. . . . .
а.
©
| {z }| {z } | {z }
прва врста друга врста M -та врста
(5.10)
д
Ра
при чему се елемент m[i][ j], коjи се у матрици m налази на пресеку врсте
коjоj jе додељен индекс i и колоне коjоj jе додељен индекс j, у низу a
налази на позициjи коjоj одговара индекс i · N + j.
int m [ 3 ] [ 2 ] [ 2 ] = { { { 3 , 8} ,
{1 , 7}} ,
{{6 , 4} ,
{9 , 2}} ,
{{5 , 8} ,
{0 , 1}}};
што jе илустровано на сл. 5.25. Елементима овог низа приступа се помоћу
три индекса коjи представљаjу координате у дискретноj тродимензионал-
ноj структури низа. Притом, и даље важи да се оваj тродимензионални
низ интерно представља на исти начин као и низови приказани на сл.
5.23 и 5.24 — секвенцом сукцесивних мемориjских блокова приказаном
на сл. 5.22(в).
.
ић
ов
5
а.
8
ат
i
ан
с 0 1
д ек
Гњ
ин
ж
6 4
др
ан
9 2
за
индекс k
•
ил
су
индекс j
3 8
М
1
а
7
1.
ав
02
пр
–2
Св
а.
©
иj
рз
ве
5.5.1 Стрингови
на
12
У програмском jезику Ц, свака симболичка константа представљена jе целоброj-
ним машинским ко̂дом (в. секциjу 5.2). Специjални симбол ’\0’ одговара целоброjноj
вредности 0.
5.5 Низови 163
ниже адресе
.
ић
⇑
ов
а.
...
ат
ан
s
s[0] ’r’
Гњ
’o’
ж
s[1]
s[2] ’b’
др
s[3] ’o’
ан
су
М
⇓
а
више адресе
1.
ав
02
пр
а
20
char s 3 [ ] = { ’ r ’ , ’ o ’ , ’ b ’ , ’ o ’ , ’ t ’ , ’ \0 ’ } ;
рз
char s4 [ 6 ] = { ’ r ’ , ’ o ’ , ’b ’ , ’ o ’ , ’ t ’ } ;
ве
13
Исто као у програмском jезику Ракет, за представљање вредности стрингова кори-
сте се наводници из енглеског правописа, а не српског.
14
Прецизниjе речено, интерне репрезентациjе ових стрингова садржаjно су исте, али
су смештене на различитим мемориjским адресама.
164 5 Типови података и инструменти апстракциjе у императивноj парадигми
а.
примеру 5.26.
ат
ан
Гњ
ж
др
5.6 Показивачи
ан
за
ил
ав
пр
Св
иj
а.
⇓ ⇓ ⇓ ⇓
ат
ан
више адресе више адресе више адресе више адресе
Гњ
ж
(а) (б) (в) (г)
др
Слика 5.28 Илустрациjа секвенце стања у мемориjи релевантних за ко̂д приказан
ан
на сл. 5.27.
за
ил
су
М
ав
пр
Св
а.
ат
2 2 2
ан
y y y
... ... ...
Гњ
ж
1 x 1 x 1 x
др
... ... ...
ан
за
ил
⇓ ⇓ ⇓
више адресе више адресе више адресе
су
М
ав
пр
⇑ ⇑ ⇑
–2
Св
2 y 2 y 6 y
... ... ...
ве
3 x 3 x 3 x
на
⇓ ⇓ ⇓
више адресе више адресе више адресе
(г) (д) (ђ)
int a1 [ 1 2 ] ;
а променљива a2 показивач на цели броj коjем jе додељена адреса првог
елемента низа a1 (тj., елемента коjем jе додељен индекс 0):
int ∗ a2 = &a1 [ 0 ] ;
У складу с имплементациjом показивача у програмском jезику Ц, вред-
ност a2 + 1 jеднака jе адреси другог елемента низа a1 , вредност a2 + 2
jеднака jе адреси трећег елемента низа a1 , итд. — вредност a2 + i jеднака
jе адреси оног елемента низа a1 коjем jе додељен индекс i. Другим речи-
ма, елементу низа a1 коjем jе додељен индекс i може се приступити на
два начина:
a1 [ i ]
или .
ић
∗ ( a2 + i )
ов
а.
ат
ан
Гњ
ж
др
ниже адресе ниже адресе
ан
⇑ ⇑ за
ил
... ...
су
a[−2]
... ...
а
... a2 ...
a1 [0] a (први елемент низа)
1.
ав
... a2 + 11 ...
Св
... ...
©
иj
рз
⇓ ⇓
више адресе више адресе
ве
(а) (б)
на
а.
другом низу или другоj променљивоj16 . Оваj ефекат назива се прекора-
ат
ан
чењем бафера, и представља познати сигурносни ризик.
Гњ
ж
Пример 5.25. Нека je низ a декларисан локално у телу функциjе f1 . Тадa
др
се у телу функциjе f1 капацитет низа a може одредити израчунавањем
ан
вредности израза:
за
ил
тj., као однос величине мемориjског простора коjи заузима цео низ a и
а
ав
пр
–2
1 int f 1 ( ) {
20
Св
2 int a [ 1 2 ] ;
20
5 }
иj
рз
Слика 5.32 Пример контекста у коjем jе могуће израчунати капацитет локално де-
ве
кларисаног низа.
на
15
Формално речено, низови се могу интерпретирати као константни показивачи, тj.,
показивачи чиjа се вредност не може мењати.
16
Нису сви програмски jезици дизаjнирани толико флексибилно у односу на преко-
рачење опсега низа. Нпр., у програмском jезику Jава, низови садрже информациjу о
свом капацитету, а приступање изван опсега низа ниjе дозвољено.
17
Прослеђивање улазних аргумената размотрено jе у секциjи 5.8.
5.7 Веза између низова и показивача 169
(5.11) у телу функциjе f2 ниjе jеднака капацитету низа, већ односу између
величине мемориjског простора коjи заузима показивач a (тj., мемориjска
адреса) и величине мемориjског простора коjи заузима jедан елемент
низа a, што jе илустровано на сл. 5.33.
1 int f 2 ( int a [ ] ) {
2 int d = sizeof ( a )/ sizeof ( a [ 0 ] ) ;
3 return d ; ← вредност d jеднака jе односу величине показивача
4 } (тj., мемориjске адресе) и величине jедног елемента низа a
Слика 5.33 Пример контекста у коjем ниjе могуће израчунати капацитет низа саоп-
штеног функциjи.
.
ић
Пошто низови не садрже информациjу о свом капацитету, приликом
ов
а.
саопштавања низа као улазног аргумента функциjе потребно jе саопшти-
ат
ан
ти и додатни улазни аргумент чиjа вредност одговара капацитету низа18 .
Гњ
ж
применом специjалног симбола ’\0’ као индикатора за завршетак стрин-
др
га. Због тога, изостављање симбола ’\0’ може да узрокуjе неочекивано
ан
за
понашање програма.
ил
су
ав
пр
Св
иj
стринга s1 . Другим речима, низ s5 , декларисан као низ коjи садржи пет
Ра
18
Примери ове праксе дати су у 6. поглављу.
170 5 Типови података и инструменти апстракциjе у императивноj парадигми
... ...
’r’ s5
опсег ’r’ s5
’o’ ’o’
опсег коjи се
’b’ ’b’
низa s5 ’o’ добиjе ’o’
’t’ кад се ’t’
’r’ s1 низ s5 ’r’ s1
опсег ’o’ интер- ’o’
’b’ претира ’b’
стринга ’o’ ’o’
s1 ’t’ као ’t’
’\0’ стринг ’\0’
... ...
⇓
. ⇓
ић
више адресе више адресе
ов
а.
(а) (б)
ат
ан
Слика 5.34 Интерна репрезентациjа стринга и низа симбола.
Гњ
ж
др
ан
•
1.
ав
1 човек,
•
02
2, 3, 4 човека,
пр
• 5, 6, 7, . . . , 20 људи,
–2
• 21 човек,
а
20
Св
jе човек.
• Ако jе последња цифра броjа n jеднака 2, 3 или 4, а претпоследња ниjе
на
1 char∗ b r o j _ i m e n i c e ( i n t n ) {
2 i n t pos = n % 1 0 ;
3 int pret = ( n / 10) % 1 0 ;
4 i f ( ( pos == 1 ) && ( p r e t != 1 ) )
5 return " covek " ;
6 e l s e i f ( ( 2 <= pos ) && ( pos <= 4 ) && ( p r e t != 1 ) )
7 return " co ve ka " ;
8 else
9 return " l j u d i " ;
10 }
Слика 5.35 Функциjа коjа враћа стринг чиjи садржаj представља облик именице
човек у номинативу коjи по броjу одговара вредности улазног целоброjног аргумента.
.
ић
5.8 Пренос улазних аргумената по вредности
ов
а.
Сваки пут кад се позове нека функциjа током извршавања програ-
ат
ан
ма, у позивни стек19 привремено се ставља тзв. оквир стека коjи садржи
Гњ
ж
податке релевантне за контекст у коjем jе функциjа позвана, укључуjу-
др
ћи вредности улазних аргумената саопштених функциjи. То значи да се
ан
ав
вредности.
02
пр
Св
функциjе.
иj
рз
1 void f 1 ( i n t a ) {
2 a = a + 1;
3 }
4
5 void f 2 ( i n t ∗b ) {
6 ∗b = ∗b + 1 ;
7 }
8
9 void f ( ) {
10 int n = 1 ;
11 f1 (n ) ; ← функциjа f1 не мења вредност променљиве n (n = 1)
12 f 2 (&n ) ; ← функциjа f2 мења вредност променљиве n (n = 2)
13 }
.
ић
ов
а.
ат
ан
Гњ
ж
тури сложене наредбе и лексичким опсезима променљивих. У програм-
др
ском jезику Ц, употребом витичастих заграда групишу се секвенце де-
ан
за
кларациjа и наредби у сложену наредбу21 , тзв. блок , коjа jе синтаксички
ил
ав
Блокови могу бити угнежђени у друге блокове, при чему име локалне
а
20
Св
иj
рз
Библиографскe напоменe:
ве
21
Нпр., у овом поглављу, витичасте заграде су коришћене за груписање декларациjа
и наредби коjе чине тело функциjе.
5.9 Закључне напомене 173
... ...
... ...
оквир 1 a оквир 2 a
стека f1 ... стека f1 ...
пренос
... ...
... ...
оквир ... оквир ...
стека f 1 n стека f 1 n
... ...
... ...
⇓ ⇓
више адресе више адресе
(а)
. (б)
ић
ов
ниже адресе ниже адресе
а.
⇑ ⇑
ат
ан
Гњ
... ...
ж
... ...
др
оквир &n b оквир &n b
ан
... ...
1.
ав
02
пр
⇓ ⇓
–2
Св
(в) (г)
20
дефинисане на сл. 5.36: (a) приликом позивања функциjе f1 , (б) након извршавања
иj
[12].
д
5.10 Задаци
а.
100, мора бити дељива и броjем 400. (Савет: в . пример 2.7 у 2 поглављу.)
ат
ан
Гњ
ж
израчунава реципрочну вредност збира два наjвећа броjа.
др
ан
за
Задатак 5.5. Напишите програм коjи декларише низ, и исписуjе вред-
ил
ав
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Поглавље 6
Итеративни процеси у императивном
програмирању
.
ић
6.1 Увод
ов
а.
ат
ан
У поглављима 3. и 4. размотрили смо две фундаменталне врсте про-
грамских процеса — рекурзивне процесе и итеративне процесе. Обе врсте
Гњ
ж
процеса имплементирали смо рекурзивним функциjама, што jе каракте-
др
ристично за функционално програмирање.
ан
за
Рекурзивни и итеративни процеси заступљени су и у императивном
ил
ав
ра.
а
20
Св
20
а.
©
на
while ( i z r a z )
д
naredba
Ра
175
176 6 Итеративни процеси у императивном програмирању
а.
ат
ан
jева.
Гњ
ж
др
Пример 6.1. Дефинишимо функциjу1 коjа израчунава збир цифара датог
ан
су
ав
пр
на jе на сл. 6.2.
–2
а
20
Св
1 int z b i r _ c i f a r a ( int n ) {
20
2 int z b i r = 0 ;
а.
©
3 while ( n != 0 ) {
иj
6 }
ве
7 return z b i r ;
8 }
д на
Слика 6.2 Функциjа коjа израчунава збир цифара датог ненегативнoг целог броjа.
Ра
1
Упоредите с примером 3.1 у 3. поглављу.
6.2 Итеративно издваjање цифара из целих броjева 177
Табела 6.1 Приказ итеративног извршавања функциjе дефинисане на сл. 6.2 кад jоj
се саопшти изабрани аргумент.
n zbir
1234 5 5
123 4
9
12 3
12
итерациjе
петље
12 14
1 15
.
излазак
ић
0
из петље
ов
0 15 ← након изласка из петље
а.
ат
ан
Гњ
ж
15 ← повратна вредност
др
ан
за
вредност међузбира издвоjених цифара. Петља се извршава све док се
ил
су
ав
пр
jе у табели 6.1.
рз
све промене коjе функциjа формално извршава над овим улазним аргу-
Ра
ментом врше се, у ствари, над копираном вредношћу, при чему изворна
вредност улазног аргумента остаjе непромењена.
2
Mеханизам преношења улазних аргумената по вредности обjашњен jе у 5. поглављу
(в. секциjу 5.8).
178 6 Итеративни процеси у императивном програмирању
1 int b r o j _ c i f a r a ( int n ) {
2 int b r o j = 0 ;
3 while ( n != 0 ) {
4 broj = broj + 1;
5 n = n / 10;
.
ић
6 }
7 return b r o j ;
ов
а.
8 }
ат
ан
Гњ
ж
Слика 6.3 Функциjа коjа израчунава броj цифара датог природног броjа n.
др
ан
за
Пример 6.3. Дефинишимо функциjу4 коjа израчунава производ цифара
ил
су
ав
пр
а
20
Св
1 int p r o i z v o d _ c i f a r a ( int n ) {
20
2 i f ( n == 0 )
а.
©
3 return 0 ;
иj
4 int proizvod = 1 ;
5 while ( n != 0 ) {
рз
6 i f ( n % 10 == 0 )
ве
7 return 0 ;
8 proizvod = proizvod ∗ (n % 10);
на
9 n = n / 10;
10 }
д
11 return p r o i z v o d ;
Ра
12 }
Слика 6.4 Функциjа коjа израчунава производ цифара датог ненегативнoг целог
броjа.
3
Упоредите с примером 3.2 у 3. поглављу.
4
Упоредите с примером 3.3 у 3. поглављу.
6.2 Итеративно издваjање цифара из целих броjева 179
а.
Други недостатак jе таj што овако добиjена функциjа не би предста-
ат
ан
вљала оптимално решење. У примеру 6.1 било jе неопходно издвоjити
Гњ
ж
све цифре броjа n да би се израчунао њихов збир. У овом примеру, из-
др
дваjање свих цифара броjа n неопходно jе само ако n не садржи цифру
ан
ав
пр
Св
20
Табела 6.2 Приказ итеративног извршавања функциjе дефинисане на сл. 6.4 кад jоj
а.
иj
n proizvod
рз
1204 5 5
на
итерациjе
120 4
д
20
петље
Ра
12 0 0
излазак из функциjе
0 ← повратна вредност
180 6 Итеративни процеси у императивном програмирању
а.
7 return r ;
ат
ан
8 }
Гњ
ж
др
Слика 6.5 Функциjа коjа генерише броj добиjен обртањем редоследа цифара улазног
ненегативног целог броjа.
ан
за
ил
су
М
Табела 6.3 Приказ итеративног извршавања функциjе дефинисане на сл. 6.5 кад jоj
1.
ав
пр
n r
–2
0
Св
20
1234 5 5
а.
©
123 4
54
иj
рз
12 3
543
итерациjе
ве
петље
12 5432
на
1 54321
д
излазак
0
Ра
из петље
0 54321 ← након изласка из петље
5
Упоредите с примером 3.4 у 3. поглављу.
6.3 Итеративна обрада монотоних секвенци броjева 181
for ( i z r a z 1 ; i z r a z 2 ; i z r a z 3 )
.
ић
naredba
ов
а.
Слика 6.6 Алтернативна синтаксичка структура петље.
ат
ан
Гњ
ж
Треба приметити да ова синтаксичка структура петље не повећава
др
експресивност програмског jезика у односу на синтаксичку структуру
ан
ав
пр
–2
izraz1 ;
а
20
Св
while ( i z r a z 2 ) {
naredba
20
izraz3 ;
а.
©
}
иj
рз
1 int f a k t o r i j e l ( int n ) {
2 int f = 1 ;
3 f o r ( i n t i = 2 ; i <= n ; i ++)
4 f = f ∗ i;
5 return f ;
6 }
.
ић
ов
Слика 6.8 Функциja коjа израчунава факториjел датог ненегативног целог броjа.
а.
ат
ан
Исто као у претходним примерима, променљива f , коjа чува вредност
Гњ
ж
међупроизвода, декларисана jе пре петље, чиме се постиже да лексички
др
опсег ове променљиве обухвата лексички опсег петље, тj., омогућаваjу
ан
ав
ност функциjе.
пр
Св
иj
6.4.
Два детаља у решењу приказаном на сл. 6.8 заслужуjу да буду додатно
на
размотрена:
д
Ра
Табела 6.4 Приказ итеративног извршавања функциjе дефинисане на сл. 6.8 кад jоj
се саопшти изабрани аргумент.
n i f
5 2 2
5
3 6
итерациjе
5 4 24
петље
5
5 120
5 6 излазак из петље
.
ић
5 - 120 ← након изласка из петље
ов
а.
ат
ан
120 ← повратна вредност
Гњ
ж
др
грамирања подразумева да се њен лексички опсег ограничи само на
ан
за
петљу, чиме се, у општем случаjу, смањуjе међусобна зависност разли-
ил
ав
Св
иj
овог проблема.
д на
1 int f a k t o r i j e l ( int n ) {
Ра
2 int f = 1 ;
3 f o r ( i n t i = n ; i >= 2 ; i −−)
4 f = f ∗ i;
5 return f ;
6 }
Слика 6.9 Друга функциja коjа израчунава факториjел датог ненегативног целог
броjа.
184 6 Итеративни процеси у императивном програмирању
1 int f a k t o r i j e l ( int n ) {
2 int f = 1 ;
3 while ( n > 1 ) {
4 f = f ∗ i;
5 n−−;
6 }
7 return f ;
8 }
Слика 6.10 Трећа функциja коjа израчунава факториjел датог ненегативног целог
броjа.
а.
ат
ан
Гњ
ж
• Ако важи n = 1, функциjа враћа вредност 0, jер броj 1, по дефинициjи,
др
ниjе прост.
ан
√
(6.2)
су
2, 3, . . . , b nc ,
М
– све док се први пут не наиђе на броj коjи jе делилац броjа n, што
а
1.
пр
– или док се не издвоjе сви броjеви из секвенце (6.2), при чему ниjедан
–2
Св
функциjа sqrt9 , коjа прихвата реални броj, а у овом примеру jоj jе саоп-
рз
9
Функциjа sqrt jе дефинисана у библиотеци математичких функциjа „math.h”. Уко-
лико се за превођење програма коjи садржи ову функциjу примењуjе преводилац gcc,
потребно jе навести опциjу превођења „-lm”.
6.3 Итеративна обрада монотоних секвенци броjева 185
1 int p r o s t ( int n ) {
2 i f ( n == 1 )
3 return 0 ;
4 f o r ( i n t i = 2 ; i <= s q r t ( n ) ; i ++)
5 i f ( n % i == 0 )
6 return 0 ;
7 return 1 ;
8 }
n − 1, n ≤ 2,
f (n) = (6.3)
f (n − 1) + f (n − 2), n>2.
.
ић
Итеративни процес израчунавања n-тог елемента Фибоначиjевог ни-
за обjашњен jе у 3. поглављу (в. пример 3.7). На сл. 6.12 приказан je
ов
а.
синтаксички запис овог итеративног процеса на програмском jезику Ц.
ат
ан
Гњ
ж
1 int f i b ( int n ) {
др
2 i f ( n <= 2 )
ан
3 return n − 1 ;
за
4 int pret = 0 ;
ил
5 i n t pos = 1 ;
су
М
6 f o r ( i n t i = 3 ; i <= n ; i ++) {
7 i n t p = pos ;
а
1.
ав
8 pos = pos + p r e t ;
9 pret = p ;
02
пр
10 }
–2
11 return pos ;
а
12 }
20
Св
20
иj
рз
ако jесте, функциjа враћа вредност првог, односно другог елемента Фи-
на
низа.
У телу функциjе декларисане су две локалне променљиве коjе памте
међурезултате и преносе их из jедне итерациjе петље у наредну:
• променљива pret чува вредност претпоследњег израчунатог елемента
Фибоначиjевог низа,
• променљива pos чува вредност последњег израчунатог елемента Фи-
боначиjевог низа,
186 6 Итеративни процеси у императивном програмирању
Табела 6.5 Приказ итеративног извршавања функциjе дефинисане на сл. 6.12 кад
jоj се саопшти изабрани аргумент.
n i pret pos
.
ић
7 - 0 1 ← пре уласка у петљу
ов
7 3 1 1
а.
ат
ан
7 4
1 2
Гњ
ж
7 5
2 3
итерациjе
др
петље
ан
7 6 3 5
за
ил
7 7
5 8
су
М
7 8 излазак из петље
а
1.
ав
пр
–2
8 ← повратна вредност
20
Св
20
а.
©
int p = pos ;
ве
pos = pos + p r e t ;
pret = p ;
на
а.
ат
( int ∗a , int n )
ан
Гњ
ж
при чему се улазни аргумент a интерпретира као показивач на први еле-
др
мент низа саопштеног функциjи. Другим речима, приликом саопштавања
ан
циjе.
а
1.
ав
Св
иj
10
Од програмера коjи позива функциjу се очекуjе да вредност аргумента n одговара
стварном капацитету низа a.
11
В. секциjу 5.7 у 5. поглављу.
12
Упоредите сa сложениjим примером 4.20 у 4. поглављу.
188 6 Итеративни процеси у императивном програмирању
1 double z b i r _ n i z a ( double a [ ] , i n t n ) {
2 int s = 0 ;
3 f o r ( i n t i = 0 ; i < n ; i ++)
4 s = s + a[ i ];
5 return s ;
6 }
Слика 6.13 Функциjа коjа израчунава збир елемената низа реалних броjева.
Табела 6.6 Приказ итеративног извршавања функциjе дефинисане на сл. 6.13 кад
jоj се саопште изабрани аргументи.
i s a
а.
1 3 [2 1 5 3 5 4]
ат
ан
2 [2 1 5 3 5 4]
Гњ
8
ж
итерациjе
др
3 11 [2 1 5 3 5 4]
петље
ан
за
4 [2 1 5 3 5 4]
16
ил
су
5 [2 1 5 3 5 4 ]
20
М
а
6 излазак из петље
1.
ав
02
пр
а
20
20 ← повратна вредност
Св
20
а.
©
13
Упоредите с примером 4.28 у 4. поглављу.
14
Пошто се издваjање елемената из низа врши од другог елемента, променљива i
инициjализована jе вредношћу 1, а не 0.
6.4 Итеративна обрада низова целих броjева 189
све док се не издвоjе сви елементи низа, а након изласка из петље, вред-
ност променљиве m прослеђуjе се наредбом return као повратна вредност
функциjе. Извршавање дате функциjе кад jоj се саопште изабрани аргу-
менти илустровано jе у табели 6.7.
1 i n t maks ( i n t a [ ] , i n t n ) {
2 int m = a [ 0 ] ;
3 f o r ( i n t i = 1 ; i < n ; i ++)
4 i f (m < a [ i ] )
5 m = a[ i ];
6 return m;
7 }
.
Слика 6.14 Функциjа коjа израчунава максимални броj непразног низа целих бро-
ић
jева.
ов
а.
ат
ан
Гњ
ж
Табела 6.7 Приказ итеративног извршавања функциjе дефинисане на сл. 6.14 кад
др
jоj се саопште изабрани аргументи.
ан
i m a
за
ил
су
- 2 [ 2 1 5 3 5 4] ← пре уласка у петљу
М
1 2 [2 1 5 3 5 4]
1.
ав
02
2 5 [2 1 5 3 5 4]
пр
–2
3 5 [2 1 5 3 5 4]
а
итерациjе
20
Св
петље
4 5 [2 1 5 3 5 4]
20
а.
5 [2 1 5 3 5 4 ]
©
5
иj
6 излазак из петље
рз
5
на
5 ← повратна вредност
д
Ра
1 i n t broj_maksimalnih ( i n t a [ ] , i n t n ) {
.
ић
2 int m = a [ 0 ] ;
3 int b r o j = 1 ;
ов
4 f o r ( i n t i = 1 ; i < n ; i ++)
а.
5 i f (m == a [ i ] )
ат
ан
6 b r o j ++;
Гњ
7 e l s e i f (m < a [ i ] ) {
ж
8 m = a[ i ];
др
9 broj = 1;
ан
10 } за
11 return b r o j ;
ил
12 }
су
М
Слика 6.15 Функциjа коjа израчунава броj jављања максималног броjа у непразном
1.
ав
пр
–2
Св
назива се линеарном.
Друго решење овог проблема, приказано на сл. 6.16, jе интуитивниjе,
на
али захтева два проласка кроз низ — у првом проласку се одређуjе мак-
д
1 i n t broj_maksimalnih ( i n t a [ ] , i n t n ) {
2 i n t m = maks ( a , n ) ;
3 int b r o j = 0 ;
4 f o r ( i n t i = 0 ; i < n ; i ++)
5 i f (m == a [ i ] )
6 b r o j ++;
7 return b r o j ;
8 }
Слика 6.16 Друга функциjа коjа израчунава броj jављања максималног броjа у не-
празном низу целих броjева.
а.
оптимално.
ат
ан
Гњ
ж
1 i n t broj_maksimalnih ( i n t a [ ] , i n t n ) {
др
2 int b r o j = 0 ;
ан
3 f o r ( i n t i = 0 ; i < n ; i ++)
за
4 i f (m == maks ( a , n ) )
ил
5 b r o j ++;
су
М
6 return b r o j ;
7 }
а
1.
ав
02
пр
Слика 6.17 Трећа функциjа, квадратне временске сложености, коjа израчунава броj
–2
Св
20
мена вредности елеменaта a[i] и a[n − 1 − i]. Ако низ a садржи непарни
броj елемената, централни елемент низа остаjе непромењен, и ниjе пред-
15
Упоредите са сложениjим примером 4.19 у 4. поглављу.
16
Кад би услов за излазак из петље (грешком) гласио i < n, редослед елемената у
низу a био би обрнут два пута, тj., резултуjуће стање низа након изласка из петље
било би идентично почетном стању.
192 6 Итеративни процеси у императивном програмирању
мет обраде у телу петље. Извршавање дате функциjе кад jоj се саопште
изабрани аргументи илустровано jе у табели 6.8.
1 void o b r n i _ r e d o s l e d _ n i z a ( double a [ ] , i n t n ) {
2 f o r ( i n t i = 0 ; i < n / 2 ; i ++) {
3 double p = a [ i ] ;
4 a[ i ] = a[n − 1 − i ];
5 a[n − 1 − i ] = p;
6 }
7 }
Слика 6.18 Функциjа коjа обрће редослед елемената у непразном низу реалних бро-
jева.
.
ић
ов
а.
ат
Табела 6.8 Приказ итеративног извршавања функциjе дефинисане на сл. 6.18 кад
ан
jоj се саопште изабрани аргументи. У свакоj итерациjи, елемент a[i] означен jе сивом
Гњ
ж
боjом, а елемент a[n − 1 − i] црним оквиром.
др
i a
ан
за
- [1 2 3 4 5 6 7] ← низ пре уласка у петљу
ил
су
0 [ 7 23456 1 ]
М
а
1.
ав
1 [7 6 3 4 5 2 1]
итерациjе
02
петље
пр
2 [7 6 5 4 3 2 1]
–2
а
3 излазак из петље
20
Св
а.
©
иj
а.
петље пореде се вредности првог и последњег елемента низа, у другоj
ат
ан
итерациjи пореде се вредности другог и претпоследњег елемента низа,
Гњ
ж
др
• кад се први пут издвоjи пар елемената чиjе су вредности различите,
ан
су
вредност прослеђуjе се 0,
М
ав
пр
–2
а
20
Св
2 f o r ( i n t i = 0 ; i < n / 2 ; i ++) {
3 i f ( a [ i ] != a [ n − 1 − i ] )
а.
©
4 return 0 ;
иj
5 }
рз
6 return 1 ;
7 }
ве
на
Слика 6.19 Функциjа коjа проверава да ли jе непразни низ целих броjева „палин-
дром“.
д
Ра
а.
ат
Слика 6.20 Функциjа коjа израчунава броj различитих елемената у датом непразном
ан
низу целих броjева.
Гњ
ж
др
За имплементирање овог итеративног процеса примењене су две пе-
ан
за
тље, при чему jе jедна петља угнежђена у другоj (в. сл. 6.20). У спољноj
ил
ав
ђење елемента a[i] с елементима a[0], a[1], . . . , a[i − 1], коjи му претходе у
пр
а
20
• први пут кад се наиђе на елемент коjи jе jеднак елементу a[i], извр-
Св
сег обухвата део изворног ко̂да до краjа тела спољне петље. Ако jе вред-
на
Пример 6.14. Дефинишимо функциjу коjа уређуjе дати низ целих броjева
монотоно неопадаjуће.
6.4 Итеративна обрада низова целих броjева 195
Табела 6.9 Приказ итеративног извршавања функциjе дефинисане на сл. 6.20 кад
jоj се саопште изабрани аргументи. У свакоj итерациjи, елемент a[i] означен jе сивом
боjом, а елемент a[ j] црним оквиром.
broj i j a
1 0 [ 1 5 3 5 1] итерациjе
)
унутрашње
петље
2 1 1 излазак из унутрашње петље
2 0 [ 1 5 3 5 1]
итерациjе
2 1 [1 5 3 5 1] унутрашње
петље
2 2 излазак из унутрашње петље
.
3
ић
итерациjе
3 0 [ 1 5 3 5 1] спољне
ов
а.
итерациjе петље
ат
3 1 [1 5 3 5 1]
ан
унутрашње
петље
Гњ
ж
излазак из унутрашње петље
3
др
4 0 [ 1 535 1]
итерациjе
ан
за
унутрашње
ил
5 - излазак из спољне петље
а
1.
ав
пр
–2
3 ← повратна вредност
а
20
Св
20
низова.
д
1 void u r e d i ( i n t a [ ] , i n t n ) {
2 f o r ( i n t i = 0 ; i < n − 1 ; i ++)
3 f o r ( i n t j = i + 1 ; j < n ; j ++)
4 if (a [ i ] > a [ j ]) {
5 int p = a [ i ] ;
6 a[ i ] = a[ j ];
7 a[ j ] = p;
8 }
9 }
Слика 6.21 Функциjа коjа уређуjе дати низ целих броjева монотоно неопадаjуће.
а.
се наиђе на елемент a[ j] коjи има мању вредност од елемента a[i], врши
ат
ан
се замена њихових вредности, чиме се постиже да након изласка из уну-
Гњ
ж
трашње петље вредност елемента a[i] представља минималну вредност
др
подниза a[i], a[i + 1], a[i + 2], . . . , a[n − 1].
ан
а
1.
ав
02
Св
а.
©
где су:
д
Ра
Табела 6.10 Приказ итеративног извршавања функциjе дефинисане на сл. 6.21 кад
jоj се саопште изабрани аргументи. У свакоj итерациjи, елемент a[i] означен jе сивом
боjом, а елемент a[ j] црним оквиром.
i j a
0 1 [ 4 5 2 1 3]
0 2 [ 2 5 4 1 3]
итерациjе
унутрашње
0 3 [ 1 54 2 3]
петље
0 4 [ 1 542 3 ]
0 5 излазак из унутрашње петље
.
ић
1 2 [1 4 5 2 3]
ов
а.
ат
ан
1 3 [1 2 5 4 3] итерациjе
итерациjе
унутрашње
Гњ
ж
1 4 [1 2 5 4 3 ] петље спољне
др
петље
1 5 излазак из унутрашње петље
ан
за
ил
2 3 [1 2 4 3]
5
су
итерациjе
М
2 4 [1 2 3 5 4 ] унутрашње
а
петље
1.
ав
2 5 излазак из унутрашње петље
02
пр
итерациjе
3 4 [1 2 3 4 5 ]
)
–2
унутрашње
а
20
20
4 - излазак из спољне петље
а.
©
17
В. секциjу 5.7 у 5. поглављу.
18
То значи да се приликом саопштавања матрице као улазног аргумента функциjе вр-
ши тзв. пренос по референци, тj., промене извршене у телу функциjе над елементима
матрице остаjу актуелне и након извршења функциjе.
198 6 Итеративни процеси у императивном програмирању
1 i n t z b i r _ m a t r i c e ( i n t m, i n t n , i n t a [ ] [ n ] ) {
2 int s = 0 ;
3 f o r ( i n t i = 0 ; i < m; i ++)
4 f o r ( i n t j = 0 ; j < n ; j ++)
5 i f ( a [ i ] [ j ] % 2 == 0 )
6 s = s + a[ i ][ j ];
7 return s ;
8 }
.
ић
Слика 6.22 Функциjа коjа израчунава збир парних елемената дате матрице целих
броjева.
ов
а.
ат
ан
Основна идеjа итеративног процеса израчунавања збира парних еле-
Гњ
ж
мената матрице може се описати на следећи начин. Издваjање елемената
др
из матрице врши се од првог елемента матрице ка последњем, и сваки из-
ан
ав
пр
1 i n t z b i r _ m a t r i c e ( i n t m, i n t n , i n t a [ ] [ n ] ) {
2 int s = 0 ;
на
3 f o r ( i n t i = 0 ; i < m ∗ n ; i ++)
4 i f ( a [ i / n ] [ i % n ] % 2 == 0 )
д
5 s = s + a[ i / n][ i % n];
Ра
6 return s ;
7 }
Слика 6.23 Друга функциjа коjа израчунава збир парних елемената дате матрице
целих броjева.
19
В. секциjу 5.5 5. поглављу.
6.5 Итеративна обрада матрица целих броjева 199
Табела 6.11 Приказ итеративног извршавања функциjе дефинисане на сл. 6.22 кад
jоj се саопште изабрани аргументи. У свакоj итерациjи, елемент a[i][ j] означен jе сивом
боjом.
i j s
.
ић
итерациjе
z }| {
j=0 j=1 j=2 j=3 спољне
ов
петље
а.
3 817 3 8 17 38 1 7 381 7
0
ат
ан
1 20 6 4 9 2 6 4 9 2 6 4 9 2 6 4 9 2
1
Гњ
2 5 801 5 8 01 58 0 1 580 1
ж
3
др
итерациjе унутрашње петље
ан
z
j=0 j=1
}|
j=2
за
j=3
{
ил
су
3 817 3 8 17 38 1 7 381 7
0
М
2 1 28 6 4 9 2 6 4 9 2 6 4 9 2 6 4 9 2
а
2 5 801 5 8 01 58 0 1 580 1
1.
ав
3
02
28
–2
а
20
Св
28 ← повратна вредност
20
а.
©
иj
налу. Елемент a[i][ j] се налази изнад главне диjагонале ако и само ако
Ра
.
ић
1 int s i m e t r i c n a ( int n , int a [ ] [ n ] ) {
ов
а.
2 f o r ( i n t i = 0 ; i < n − 1 ; i ++)
ат
ан
3 f o r ( i n t j = i + 1 ; j < n ; j ++)
4 i f ( a [ i ] [ j ] != a [ j ] [ i ] )
Гњ
ж
5 return 0 ;
др
6 return 1 ;
7 }
ан
за
ил
су
Слика 6.24 Функциjа коjа проверава да ли jе дата квадратна матрица целих броjева
М
ав
02
а
20
Св
20
иj
21
В. секциjу 5.5.1 у 5. поглављу.
6.6 Итеративна обрада стрингова 201
Табела 6.12 Приказ итеративног извршавања функциjе дефинисане на сл. 6.24 кад
jоj се саопште изабрани аргументи. У свакоj итерациjи, елемент a[i][ j] означен jе сивом
боjом, а елемент a[ j][i] црним оквиром.
i j
а.
8 4 8
1 2 спољне
ат
1 9 0 1 1 9 0 1
ан
3 петље
2 1 6
7 2 1 6 7
Гњ
ж
итерациjе
др
унутрашње
ан
петље
за
ил
z }| {
j=3
су
М
3 8 1 7
а
8 4 9 2
2 3
1.
ав
1
1 9 0
02
1
пр
7 2 6
4 - излазак из спољне петље
–2
а
20
Св
1 ← повратна вредност
20
а.
©
иj
1 i n t d u z i n a ( char ∗ s ) {
2 int i ;
3 f o r ( i = 0 ; s [ i ] != ’ \0 ’ ; i ++);
4 return i ;
5 }
а.
показивач s1 , и инициjализован вредношћу показивача s, тj., оба покази-
ат
ан
вача садрже адресу првог симбола стринга. У свакоj итерациjи петље,
вредност показивача s1 увећава се за 1, тj., показивачу s1 се додељуjе
Гњ
ж
адреса следећег елемента у низу, све док се не дође до краjа стринга. На-
др
кон изласка из петље, s1 садржи адресу специjалног симбола ’\0’, а броj
ан
за
симбола у стрингу израчунава се као разлика показивача s1 и s. Изврша-
ил
jе на сл. 6.27.
М
а
1.
ав
1 i n t d u z i n a ( char ∗ s ) {
02
пр
2 char ∗ s 1 = s ;
–2
3 while ( ∗ s 1 != ’ \0 ’ )
а
4 s 1++;
20
Св
5 return s 1 − s ;
20
6 }
а.
©
иj
Слика 6.26 Друга функциjа коjа одређуjе броj симбола у датом стрингу.
рз
ве
стринга, и генерише:
д
⇓ ⇓ ⇓ ⇓
више адресе више адресе више адресе више адресе
s1 − s
.
ић | {z }
3
повратна
ов
а.
вредност
ат
ан
Слика 6.27 Приказ итеративног извршавања функциjе дефинисане на сл. 6.26 кад
Гњ
ж
jоj се саопшти изабрани аргумент.
др
ан
нису jеднаки, или кад се издвоjе сви симболи из бар jедног од датих
су
стрингова.
М
а
1.
ав
02
1 i n t u p o r e d i ( char ∗ s1 , char ∗ s 2 ) {
пр
2 while ( ( ∗ s 1 == ∗ s 2 ) && ( ∗ s 1 != ’ \0 ’ ) ) {
–2
3 s 1 ++;
а
20
4 s 2 ++;
Св
5 }
20
6 return ∗ s 1 − ∗ s 2 ;
а.
7 }
©
иj
рз
( ( ∗ s 1 == ∗ s 2 ) && ( ∗ s 1 != ’ \0 ’ ) && ( ∗ s 2 != ’ \0 ’ ) )
Међутим, оваj услов се може концизниjе формулисати. Ако бар jедан од
прва два подизраза има нетачну вредност, услов петље ниjе задовољен,
без обзира на буловску вредност трећег подизраза. У супротном, ако прва
два подизраза имаjу тачне вредности, вредност трећег подизраза такође
204 6 Итеративни процеси у императивном програмирању
а.
разлике целоброjних вредности коjе представљаjу ове симболе индикуjе
ат
ан
лексикографски однос стрингова.
Гњ
ж
Треба уочити важну разлику у односу на претходни пример. У приме-
др
ру 6.17, повратна вредност функциjе одређена jе као разлика показивача,
ан
су
М
ав
02
пр
Св
тивном програмирању.
на
Библиографскe напоменe:
д
Ра
23
Аналогно, из почетног услова петље се може уклонити други подизраз, уместо
трећег.
6.8 Задаци 205
.
ић
6.8 Задаци
ов
а.
Задатак 6.1. Претпоставите да jе n природни броj већи од 1. Дефини-
ат
ан
шите функциjу коjа одређуjе наjмањи нетривиjални делилац броjа n (тj.,
Гњ
ж
наjмањи делилац чиjа jе вредност већа од 1).
др
ан
ав
02
а
20
Св
Задатак 6.6. Дефинишите функциjу коjа прихвата два низа целих бро-
jева, и утврђуjе да ли за сваки елемент првог низа постоjи бар jедан
на
.
ић
[1] Harold Abelson, Gerald Jay Sussman, Julie Sussman (1996) Structure and
Interpretation of Computer Programs, second edition, MIT Press, Cambridge,
ов
а.
Massachusetts, London, England.
ат
ан
[2] Robert J. Chassell (2009) An Introduction to Programming in Emacs Lisp, revised
third edition, GNU Press, Free Software Foundation, Inc.
Гњ
ж
[3] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein (2009)
др
Introduction to Algorithms, third edition, Cambridge, Massachusetts: MIT Press.
[4] Paul Deitel, Harvey Deitel (2016) C: How to Program, eight edition, global edition,
ан
[5] Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi
су
[6] Matthew Flatt and PLT (2010) The Racket Reference, PLT-TR-2010-1, PLT Design
а
ав
[7] Daniel P. Friedman, Matthias Felleisen (1995) The Seasoned Schemer, Second
02
[13] Charles Antony Richard Hoare (1961) Algorithm 64: Quicksort. Communications of
рз
207
208 БИБЛИОГРАФИJА
[21] John McCarthy, Paul W. Abrahams, Daniel J. Edwards, Timothy P. Hart, Michael
I. Levin (1962) LISP 1.5 Programmer’s Manual, The MIT Press.
[22] Peter Norvig (1992) Paradigms of Artificial Intelligence Programming: Case studies
in Common Lisp. San Francisco, Calif: Morgan Kaufmann Publishers.
[23] Alan J. Perlis (1982) Epigrams on Programming, SIGPLAN Notices, 17(9), pp. 7–13.
[24] Roland Pesch, Osier JM (2000) The GNU Binary Utilities, Version 2.9.1. iUniverse
https://ftp.gnu.org/old-gnu/Manuals/binutils-2.12/binutils.html.
[25] Dennis M. Ritchie (1993) The development of the C language, ACM SIGPLAN
Notices 28(3), pp. 201–208.
[26] Alex Shinn, John Cowan, and Arthur A. Gleckler (Eds.) et al. (2013)
Revised7 Report on the Algorithmic Language Scheme, R7RS Working Group 1,
https://small.r7rs.org/, accessed November 22, 2020.
[27] Michael Sperber, R. Kent Dybvig, Matthew Flatt, Anton Van Straaten, Robby
Findler, Jacob Matthews (2009). Revised6 Report on the Algorithmic Language
Scheme. Journal of Functional Programming, 19(S1), pp. 1–301.
[28] Richard M. Stallman, Roland Pesch, Stan Shebs (2011) Debugging with GDB: The
.
GNU Source-Level Debugger, V 7.3.1, Tenth Edition. Free Software Foundation, Inc.
ић
http://www.gnu.org/software/gdb/documentation/.
ов
[29] Richard M. Stallman et al. (2003) Using the GNU Compiler Collection. Free Software
а.
Foundation, Inc. https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc.pdf.
ат
ан
[30] Michael Thorne (1991) Computer Organization and Assembly Language
Programming for IBM PCs and Compatibles (2nd ed.). The Benjamin/Cummings
Гњ
ж
Publishing Company, Inc.
др
[31] David S. Touretzky (1990) COMMON LISP: A Gentle Introduction to Symbolic
ан
[33] Joseph Weizenbaum (1976) Computer Power and Human Reason: From Judgment
М
ав
02
пр
–2
а
20
Св
20
а.
©
иj
рз
ве
д на
Ра
Индекс поjмова
.
ић
ов
А декларисање показивача, 164, 165, 202
а.
адресна аритметика, 201, 205 декларисање променљиве, 148, 149,
ат
ан
152–154, 164, 165, 172, 177, 182,
185–188, 192–194, 201
Гњ
ж
безимене функциjе, 31, 53, 56, 57, 69, декларисање функциjе, 154, 170, 192
др
134, 135 десна асоциjативност, 150, 158
ан
бесконачност диграф, 23 за
негативна, 11, 12 дисjункциjа, 17, 145, 147, 148
ил
броjеви И
1.
ав
комплексни, 8–10, 13, 15, 16, 20, 144 именовани улазни аргумент, 66, 67,
02
буловске вредности, 3, 16–18, 20, 22, 128, 129, 131, 175, 176, 180, 182,
иj
24, 27, 145, 147, 148, 203 184, 185, 187, 190, 193–195, 198,
203, 204
рз
К
временска сложеност, 190, 191, 195 конверзиjа, 13, 76, 151–153, 167
квадратна, 191
д
Д Л
декларисање низа, 159, 160, 163, 164, лексички опсег, 57–61, 63, 64, 96, 172,
168, 169, 174, 198 177, 182, 183, 194, 201
209
210 ИНДЕКС ПОJМОВА
лењо израчунавање, 148 165, 167, 168, 171, 172, 176, 177,
листа, 101, 103–125, 127–139 179, 180, 182, 183, 185–194, 196,
локално повезивање, 60, 64, 69, 97 198–201
паралелно, 60–62, 64, 69 глобалне, 31–33, 57–59
секценциjално, 60, 62–64, 69 локалне, 31, 57–64, 67, 97, 149,
171–173, 185
М прости броj, 93–97, 184
матрица, 137, 160, 161, 196–200, 205
Р
Н
рекурзивни процес, 71, 98–100, 108,
наводници, 22, 163
110, 111, 113, 114, 116, 119, 120,
неброj, 12
122–125, 127–129, 139, 175
негациjа, 17, 145, 147
репна рекурзиjа, 65, 71, 76–80, 83–86,
нетерминални чвор, 88
92–94, 97–100, 118
неутрални елемент, 80, 86, 177, 179,
референтнa транспарентност, 143
182
низ, 143, 145, 159–165, 167–169, 172,
.
ић
174, 184–197, 200–202, 205 С
сигмоидна функциjа, 63, 174
ов
а.
О симболи, 3, 22–24, 28, 29, 144, 145,
ат
ан
Оjлеров броj, 63, 174 специjални, 22, 23, 162–164, 169,
Гњ
ж
оквир стека, 67, 74–76, 78, 80, 81, 86, 200–202
др
88, 90, 93, 100, 171 синтаксички шећер, 181, 204, 205
скуп, 137, 176
ан
П
за
суфиксни оператор, 151
ил
подразумевана вредност улазног тело петље, 176, 177, 179, 182, 186,
а
ав
Св
терминални чвор, 88
показивач на низ, 197
20
полунаводници, 22
а.
праг, 65, 66 У
©
предикат, 20, 21, 25, 37, 46, 106, 107 услов петље, 176, 191, 194, 203, 204
рз
33, 35 Ф
Ра