Определяне на цифри в естествено число - рекурсия и итерация
рекурсия - цифри в естествено число
рекурсия - монотонна редица
рекурсия - елемент в редица
рекурсия - сума от елементи в редица
рекурсия - алгоритъм на Евклид
рекурсия - естествено число, палиндром
рекурсия - триъгълник от знаци
рекурсия - минимална стойност в редица
рекурсия - бързо сортиране
рекурсия - Питагорова тройка числа
рекурсия - верижна дроб
рекурсия - диаметър на множество
рекурсия - алчен алгоритъм
Следващите програми илюстрират идеята, че рекурсия и итерация са алтернативни подходи при решаване на широк кръг задачи. Изборът рекурсия или итерация трябва да бъде обвързан с конкретния проблем, а не да бъде самоцел. В много от случаите при циклична обработка се ползва масив. При използване на рекурсия се препоръчва масивът да не се предава като параметър. Итерацията изглежда по-разбираема, рекурсията е по-бърза, но и изисква повече памет. Когато казваме, че една програма е рекурсивна се разбира, че тя съдържа в себе си поне една рекурсивна функция.
Под естествено число ще разбираме цяло положително число (1,2,3,...,n). Цифрите в 10-ична бройна система са 0,1,2,3,4,5,6,7,8,9 и също са числа. Алгоритъм за определяне броя и вида цифри в естествено число: въвежда се естествено число; това число се дели целочислено на основата на бройната система - в случая 10; последната (най-дясната) цифра може да бъде определена чрез операцията %, следващата стъпка е целочислено делене на 10 - премахваме последната цифра. Алгоритъмът продължава докато редуцираното число е по-голямо от 0. Всяка програма съдържаща цикличен алгоритъм може да се реализира, както с итерация, така и с рекурсия.
Тук целта е да се представят успоредно двата варианта - с рекурсия и итерация.Задачата е следната:
От клавиатурата се въвежда естествено число N от интервала [1..10001].
Програмата трябва да изведе сумата на всички единици, участващи в изписването на числата от интервала [1..N] при представянето им в 2-ична бройна система.
Пример: 4 Изход: 5
1 – 1
2 - 10
3 – 11
4 – 100
Общият брой на 1-ците е 5.
Кратко описание на алгоритъма брой и вид цифри в двоично число.
Въвежда се естествено число.
Създадени са 2 вложени цикъла. Външният обхожда всички числа от интервала. Вътрешният брой всички единици на поредното число, чрез проверка на най-дясната цифра. След като е проверена тази цифра се изтрива.
В езика C/C++ има възможност да се работи директно с разрядите на въведеното число:
а) i & 1;//операция AND
дали въведеното число е четно или нечетно, дали последна цифра на това число в 2-ично представяне е 0 или 1
б) i=i>>1;//всички разряди се премества с 1 позиция надясно, т.е. маха се най-десния разряд, най-дясната цифра на въведеното число.
Същият резултат може да се постигне и чрез целочислено делене на 2 и проверка на целочисления остатък. Този подход е приложен във функцията redica2.
Реализацията на алгоритъма е в 3 варианта: чрез вложен цикъл (redica2), чрез 2 отделни цикъла (redica и chislo) и чрез съставна рекурсия (redica1 и chislo1).
За по-голяма яснота при съпоставяне рекурсия итерация освен една функция с вложен цикъл са реализирани две отделни функции.
Следващата примерна програма реализира решена задача за извеждане на всички цифри в естествено число чрез итерация.
рекурсия - монотонна редица
Имаме редица състояща се от предварително въведени N броя естествени числа. Трябва да се провери дали редицата е монотонно намаляваща, т.е. дали всяко число от редицата е по-голямо или равно на следващото. Да се използва рекурсия.
Алгоритъм:
За да се въведат елементите в редицата се използва масив, който е деклариран като глобален.
Чрез рекурсия се обхожда масива започвайки от неговия последен член с индекс n-1.
В рекурсивното извикване се проверява условието if (mas[n-2]>=mas[n-1]).
Следващата примерна програма реализира проверка за монотонност чрез рекурсия:
рекурсия - елемент в редица
Имаме редица от предварително въведени N броя естествени числа. Трябва да се провери дали в редицата се съдържа елемент с определена стойност. Да се използва рекурсия.Алгоритъм:
Използва се масив, който е деклариран като глобален – при всяко рекурсивно извикване фунцията зарежда отново в оперативната памет кода и данните си.
Чрез рекурсия се обхожда масива започвайки от неговия последен член.
Резултатът от проверката mas[0] == x е от булев тип и е дъно на рекурсия.
Условието за равенство се проверява в рекурсивното извикване чрез логически OR x == mas[n-1] || tursi (x,n-1).
Следващата примерна програма реализира проверка наличие на определена стойност в редица чрез рекурсия:
рекурсия - сума от елементи в редица
Имаме редица съставена от предварително въведени N броя естествени числа. Трябва да се изчисли сумата на всички елементи в редицата. Да се използва рекурсия.
Алгоритъм:
Използва се масив, който е деклариран като глобален.
Чрез рекурсия се обхожда масива започвайки от неговия последен член.
В рекурсивното извикване се натрупва сумата return have_sum( chis-1 )+ mas[chis]. Началната стойност на сумата е 1-вия елемент от редицата return mas[0] - дъно на рекурсия.
Разликата на подхода при рекурсия и итерация се вижда от приложената блок схема:
Следващата примерна програма реализира сума на елементи от редица чрез рекурсия:
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.