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

Нажмите для полного просмотра!
Программирование на языке С++. Лекция 9. Рекурсия, слайд №1Программирование на языке С++. Лекция 9. Рекурсия, слайд №2Программирование на языке С++. Лекция 9. Рекурсия, слайд №3Программирование на языке С++. Лекция 9. Рекурсия, слайд №4Программирование на языке С++. Лекция 9. Рекурсия, слайд №5Программирование на языке С++. Лекция 9. Рекурсия, слайд №6Программирование на языке С++. Лекция 9. Рекурсия, слайд №7Программирование на языке С++. Лекция 9. Рекурсия, слайд №8Программирование на языке С++. Лекция 9. Рекурсия, слайд №9Программирование на языке С++. Лекция 9. Рекурсия, слайд №10Программирование на языке С++. Лекция 9. Рекурсия, слайд №11Программирование на языке С++. Лекция 9. Рекурсия, слайд №12Программирование на языке С++. Лекция 9. Рекурсия, слайд №13Программирование на языке С++. Лекция 9. Рекурсия, слайд №14Программирование на языке С++. Лекция 9. Рекурсия, слайд №15Программирование на языке С++. Лекция 9. Рекурсия, слайд №16Программирование на языке С++. Лекция 9. Рекурсия, слайд №17

Вы можете ознакомиться и скачать презентацию на тему Программирование на языке С++. Лекция 9. Рекурсия. Доклад-сообщение содержит 17 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





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

Слайд 2





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

Слайд 3





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

Слайд 4





Факториал
Факториал числа n (n!) – произведение всех натуральных чисел от 1 до n включительно (принято, что 0! = 1).
int factorial(int n) {
	if (n < 2)
		return 1;
	return n*factorial(n - 1);
}
Описание слайда:
Факториал Факториал числа 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);
}
Описание слайда:
Число Фибоначчи Числа Фибоначчи – элементы последовательности, в которой первые два числа равны 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 для каждой из полученных половин (в первый раз получим четыре поддиапазона исходной последовательности) до тех пор, пока значение индексов для каждого вложенного диапазона будут или равны, или изменят отношение. В результате мы получим упорядоченную последовательность
Описание слайда:
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;
}
Описание слайда:
Итеративный факториал 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.
Описание слайда:
Рекурсия в языке 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 
               }             }
Описание слайда:
Рекурсия в языке 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++
Описание слайда:
Рекурсия в языке C++

Слайд 12





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

Слайд 16





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

Слайд 17


Программирование на языке С++. Лекция 9. Рекурсия, слайд №17
Описание слайда:



Похожие презентации
Mypresentation.ru
Загрузить презентацию