Программирование на языке С++. Лекция 9. Рекурсия презентация

Содержание


Презентации» Информатика» Программирование на языке С++. Лекция 9. Рекурсия
Программирование на языке С++
 Зариковская Наталья Вячеславовна
 Лекция 9Рекурсия в языке C++
 В программировании рекурсия — вызов функции (илиОбщий вид
 Прямая рекурсия
 int function() {
   …
 Факториал
 Факториал числа n (n!) – произведение всех натуральных чисел отЧисло Фибоначчи 
 Числа Фибоначчи – элементы последовательности, в которой первыеQuickSort
 Другим интересным примером использования рекурсивных функций может служить алгоритм быстройРекурсия в программе – это плохо
 По крайней мере в большинствеИтеративный факториал
 int factorial(int n) {
 	if (n < 2)
 		returnРекурсия в языке C++
 Примером задачи, где оправдано использование рекурсии, можетРекурсия в языке C++
 Рекурсивная функция должна всегда определять условие окончания,Рекурсия в языке C++Рекурсия в языке C++
 Технология использования рекурсивных функций весьма проста. ОднакоРекурсия в языке C++
 #include<iostream.h>
 float kk,b;
 float kuzy (int);
 voidРекурсия в языке C++
 Эта же программа при использовании рекурсивного алгоритмаРекурсия в языке C++
 Незаменимы рекурсивные процедуры при решении интеллектуальных задач,Рекурсия в языке C++



Слайды и текст этой презентации
Слайд 1
Описание слайда:
Программирование на языке С++ Зариковская Наталья Вячеславовна Лекция 9


Слайд 2
Описание слайда:
Рекурсия в языке C++ В программировании рекурсия — вызов функции (или процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия). Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Рекурсивная программа позволяет описать повторяющееся или даже потенциально бесконечное вычисление, причём без явных повторений частей программы и использования циклов. Язык С++, как и большинство языков программирования высокого уровня, поддерживает рекурсивные вызовы. В С++ любая функция, кроме main() может быть рекурсивной.

Слайд 3
Описание слайда:
Общий вид Прямая рекурсия int function() { … function() … }

Слайд 4
Описание слайда:
Факториал Факториал числа n (n!) – произведение всех натуральных чисел от 1 до n включительно (принято, что 0! = 1). int factorial(int n) { if (n < 2) return 1; return n*factorial(n - 1); }

Слайд 5
Описание слайда:
Число Фибоначчи Числа Фибоначчи – элементы последовательности, в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих чисел. (0, 1, 1, 2, 3, 5, 8…) int fibonacci(int n) { if (n < 1) return 0; if (n == 1) return 1; return fibonacci(n - 1)*fibonacci(n – 2); }

Слайд 6
Описание слайда:
QuickSort Другим интересным примером использования рекурсивных функций может служить алгоритм быстрой сортировки (quicksort). Этот алгоритм получил широко распространение во многих прикладных программах. Однако эффективность его использования существенным образом зависит от числа элементов сортируемого массива, а также характера распределения этих данных. 1. Выбирается какой-либо элемент (x) (обычно находящийся в середине последовательности). Будем просматривать массив слева до тех пор, пока не обнаружим элемент аi>x, затем будем просматривать массив справа, пока не встретится аj<x. Теперь поменяем местами эти два элемента и продолжим наш процесс просмотра и обмена, пока оба просмотра не встретятся где-то в середине массива (значение i и j равны). В результате массив окажется, разбит на две половины с ключами <=x и >=x, а сам элемент “x” будет находиться в необходимом месте 2. Итерационно повторяем процесс 1 для каждой из полученных половин (в первый раз получим четыре поддиапазона исходной последовательности) до тех пор, пока значение индексов для каждого вложенного диапазона будут или равны, или изменят отношение. В результате мы получим упорядоченную последовательность

Слайд 7
Описание слайда:
Рекурсия в программе – это плохо По крайней мере в большинстве случаев. Достоинства рекурсии: высокая читаемость кода; малое количество кода. Недостатки рекурсии: низкая скорость работы; высокое использование памяти.

Слайд 8
Описание слайда:
Итеративный факториал int factorial(int n) { if (n < 2) return 1; int result = 1; while(n > 1) { result *= n; n--; } return result; }

Слайд 9
Описание слайда:
Рекурсия в языке C++ Примером задачи, где оправдано использование рекурсии, может служить решение задачи о Ханойских башнях. Эта задача формулируется следующим образом: имеется три стержня. На одном из них находятся диски, разных размеров, сужающиеся к верху (пирамида). Требуется перенести эти диски на другой стержень, используя только один, вспомогательный стержень. При этом за один раз можно перенести только один диск, а больший по размеру диск не допустимо ставить на диск меньшего размера Доказательство решения этой задачи основано на использовании индукционного метода, из которого непосредственно следует алгоритм, основанный на использовании рекурсивных функций. Так, для случая одного диска решение, очевидно, он просто перекладывается с исходного стержня на заданный. Для случая из двух дисков сначала верхний диск перекладывается на вспомогательный стержень, а затем нижний диск с исходного стержня и верхний со вспомогательного стержня перекладываются на заданный. Аналогично, для случая N дисков, сначала N-1 дисков при соблюдении правил перестановки перемещаются на вспомогательный стержень, а затем на заданный стержень переносится нижний диск (он нашёл своё место). Далее, учитывая, что последний диск, перемещённый на заданный стержень, никак не мешает, поскольку он больше всех остальных, задача решается аналогично. Исключение состоит в том, что N-1 диск, из оставшихся, перемещаются на вспомогательный, который ранее был исходным, используя в качестве промежуточного заданный, а последний из оставшихся снова перемещается на заданный стержень. Таким образом, после двух циклов перестановок, мы приходим к исходной ситуации использования стержней, но количество дисков, которых необходимо переставить меньше на два диска и т.д.. Процесс рекурсии останавливается, когда остаётся только один диск, который перемещается на заданный. Доказано, что для n дисков минимальное число необходимых перемещений равно 2^n-1.

Слайд 10
Описание слайда:
Рекурсия в языке C++ Рекурсивная функция должна всегда определять условие окончания, иначе рекурсия станет бесконечной. #include<iostream.h> int k; void Hanoy1 (char a,char b,char c,int n ); void main() {cout<<”введите колличество дисков”<< “\n”; cin>>k; Hanoy1 (‘A’,‘C’,‘B’,k);//перенесено k дисков с A на C промежуточный B cin>>k; } void Hanoy1 (char a,char b,char c,int n ) {int v; v=n; if (n==1) cout<<”переместить “<< v<<” с “<< a<<” на “<<b<<”\n”; else {Hanoy1(a,c,b,n-1); //перенесено n-1 дисков с A на C промежуточный B cout<<”переместить “<<v<<” с “<< a<<” на “<< b<<”\n”; Hanoy1 (c, b, a, n - 1); //перенесено n - 1 дисков с C на B промежуточный A } }

Слайд 11
Описание слайда:
Рекурсия в языке C++

Слайд 12
Описание слайда:
Рекурсия в языке C++ Технология использования рекурсивных функций весьма проста. Однако при использовании рекурсивных функций необходимо особое внимание уделять анализу целесообразности их применения. Например, рассмотрим пример решения задачи расчёта долга клиента банка, который взял некоторую сумму под ежемесячный процент от текущей суммы долга. Эта задача может быть решена как с использованием рекурсивных функций, так и с помощью итерационных алгоритмов. При использовании рекурсивных функций для решения этой задачи необходимо: определить условие окончания - начальная сумма кредита (if (n==0) kuz=b;); определить в выражение расчёта долга относительно текущего (kuz=kuzy(n-1)*(1+kk);). После чего алгоритм и программа решения задачи, приведенная ниже, становится весьма прозрачной

Слайд 13
Описание слайда:
Рекурсия в языке C++ #include<iostream.h> float kk,b; float kuzy (int); void main() { int n ; cout<<" введите кол месяцев"<< "\n"; cin>>n; cout<<"введите начальную сумму долга"<< "\n"; cin>>b; cout<<"введите ежемесячный процент - вещественное число" << "\n"; cin>>kk; cout<<"долг="<<kuzy(n)<<'\n'; cin>>kk; } float kuzy(int n ) {float kuz; if (n<0) cout<<"ошибка в задании количества месяцев"<< "\n"; else if (n==0) kuz=b; else kuz=kuzy(n-1)*(1+kk); return kuz; }

Слайд 14
Описание слайда:
Рекурсия в языке C++ Эта же программа при использовании рекурсивного алгоритма не менее красива, но значительно эффективнее. #include<iostream.h> float kk,b; void main() { int n ; float kuz; cout<<" введите кол месяцев"<< '\n'; cin>>n; cout<<"введите начальную сумму долга"<< '\n'; cin>>b; cout<<"введите ежемесячный процент"<< "\n"; cin>>kk; kuz=b; while (n>0) {kuz=kuz*(1+kk); n--; } cout<<"долг="<<kuz<<'\n'; cin>>kk; }

Слайд 15
Описание слайда:
Рекурсия в языке C++ Незаменимы рекурсивные процедуры при решении интеллектуальных задач, где используются алгоритмы с возвратом. Целесообразно проанализировать приведенный ниже листинг программы решения задачи обхода шахматным конём шахматной доски.

Слайд 16
Описание слайда:
Рекурсия в языке C++

Слайд 17
Описание слайда:


Скачать презентацию на тему Программирование на языке С++. Лекция 9. Рекурсия можно ниже:

Похожие презентации