- •Ф.Ф. Павлов языки программирования
- •Санкт-Петербург
- •230201 - Информационные системы и технологии
- •Тема 2 посвящена изучению жизненного цикла программы и основным этапам решения задач на эвм.
- •Тема 4 изучает типы пользовательских интерфейсов, классификацию диалогов и основные компоненты графических пользовательских интерфейсов.
- •Тема 8 посвящена структурам данных фиксированного размера (массивы), а также типам данных, определяемых пользователем (структуры, объединения, перечисления).
- •Тема 10 изучает динамические структуры данных: виды и способы реализации списков, динамическое выделение памяти.
- •Тема 12 затрагивает вопросы обработки файлов данных: понятия записи, файла данных и способы доступа, операции и средства обработки файлов, контроль операций обработки файлов.
- •Тема 14 вводит в технологию объектно-ориентированного программирования.
- •Раздел I Принципы программирования на языках высокого уровня
- •Тема 1. Эволюция языков программирования
- •1.1. Неструктурированное, «стихийное» программирование
- •1.2. Процедурное (модульное) программирование
- •1.3. Объектно-ориентированное программирование
- •1.4. Компонентные технологии программирования
- •Тема 2. Жизненный цикл программы и основные
- •2.1. Дружественность, жизненный цикл программы
- •2.2. Постановка задачи и спецификация программы
- •2.3. Проектирование и реализация программы
- •2.4. Способы записи алгоритма
- •2.5. Критерии качества программы
- •3.1. Классификация программных продуктов
- •3.3. Модели программирования в ms-dos и Windows
- •Тема 4. Диалоговые программы
- •4.1. Типы пользовательских интерфейсов
- •4.2. Классификация диалогов и их реализация
- •4.3. Основные компоненты графических
- •Тема 5. Программа на языке высокого уровня
- •5.1. Структура программы и функции
- •5.2. Стандартные типы данных и операции над ними
- •5.3. Адресные типы данных: указатели и ссылки
- •5.4. Стандартные библиотеки языка
- •5.5. Классы памяти
- •Раздел 2 Управляющие структуры и структуры данных
- •Тема 6. Представление управляющих структур
- •6.1. Структура следования
- •6.2. Структуры ветвления
- •6.3. Структуры повторения
- •Int kol, //счетчик введенных оценок
- •Int god; //число лет
- •Тема 7. Адресные типы данных
- •7.1. Указатели
- •7.2. Ссылки
- •Тема 8. Структуры данных фиксированного размера
- •8.1. Массивы
- •8.2. Типы данных, определяемые пользователем
- •Тема 9. Функции (процедуры)
- •9.1. Определение, прототип и вызов функции
- •9.2. Передача параметров
- •9.3. Программирование рекурсивных алгоритмов
- •Тема 10. Динамические структуры данных
- •10.1. Списки: основные виды и способы реализации
- •10.2. Динамическое выделение памяти
- •Раздел 3 Процедурное программирование
- •Тема 11. Ввод/вывод данных
- •11.1. Видеофункции библиотеки conio.H
- •11.2. Функции библиотеки потокового ввода/вывода
- •Тема 12. Обработка файлов данных
- •12.1. Записи и файлы данных
- •12.2. Операции и средства обработки файлов
- •12.3. Контроль операций обработки файлов
- •Тема 13 Технология процедурного программирования
- •13.1. Способы конструирования программ
- •13.2. Проектирование программы: методы декомпозиции и и модульного программирования
- •13.3. Реализация программы: методы структурного
- •Тема 14. Введение в технологию объектно-
- •14.1. Основные понятия объектно-ориентированного
- •14.2. Проектирование программы
- •14.3. Реализация программы
- •Утверждаю
- •Рабочая программа
- •Технология программирования
- •Санкт-Петербург
- •Тема 1. Технология программирования и этапы ее
- •Тема 2. Жизненный цикл программы и основные этапы
9.3. Программирование рекурсивных алгоритмов
Обычно одни функции вызывают другие функции согласно иерархической структуре программы. Но существуют ситуации, когда полезно иметь функцию, которая вызывает сама себя.
Рекурсивная функция – это функция, которая вызывает сама себя.
Рассмотрим понятие рекурсии на классическом примере – расчете факториала целого числа.
Факториал n! равен n*(n-1)*(n-2)*…*1 ,причем 1!=1 и 0!=1. Пусть надо вычислить 3!=3*2*1, что можно свести к 3*(2!). Рекурсивная задача разбивается на этапы, где вызывается рекурсивная функция, которая вычисляет n*(n-1)!: 3! -> 3*2! -> 2*1! -> 1.
Рекурсивная функция последовательно делит задачу на две части: одну часть (* - умножение) она может решить, а вторую часть ((n-1)!) она не может решить. Для выполнения рекурсии необходимо, чтобы вторая часть была похожа на исходную задачу, но быть несколько меньше. И тогда рекурсивная функция вызывает новую копию самой себя. Это называется рекурсивным вызовом или шагом рекурсии. Процесс рекурсии приводит к формированию все меньших и меньших задач и заканчивается, когда функция достигает базовую задачу (1!=1). Затем функция последовательно возвращает в обратном порядке значения рекурсивных вызовов оператору вызова, пока не будет возвращено окончательное решение: (1) -> (2*1=2) -> (3*2=6).
Пример 7. «Рекурсивные алгоритмы»
Условие задачи: создать рекурсивную функцию вычисления факториала.
Создать проект консольного приложения и ввести имя проекта TPlab2_2.
Создается исходный файл TPlab2_2.cpp, который будет содержать всего одну пустую функцию main():
int t_main(int args, _TCHAR* argv[])
{return 0;}.
Проект должен содержать файл заголовков TPlab2_2.h и файл кодов TPlab2_2.cpp.
Создать файл TPlab2_2.h, ввести текст файла и сохранить его:
//файл заголовков TPlab2_2.h
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int fact(int);
Добавить в файл кодов TPlab2_2.cpp подключение файла заголовков и текст функции main():
//файл кодов TPlab2_2.cpp
#include "stdafx.h"
#include "TPlab2_2.h"
int _tmain(int argc, _TCHAR* argv[])
{
int res, n;
cout<<"Vvedite celoe chislo: ";
cin>>n;
res=fact(n);
cout<<n<<"!="<<res<<endl;
return 0;
}
int fact(int n)
{
if (n<=1)
return 1;
else
return n*fact(n-1);}
Пусть требуется вычислить 3!. Вызывается функция fact(3). При входе в функцию формальному параметру n присваивается значение фактического параметра 3 и выполняется выражение 3*fact(2), т.е. опять вызывается функция fact для вычисления fact(2). При входе в функцию формальному параметру n присваивается значение 2 и выполняется выражение 2*fact(1), т.е. опять вызывается функция fact для вычисления fact(1). При входе в функцию формальному параметру n присваивается значение 1 и выполняется выражение 1*fact(0), т.е. опять вызывается функция fact для вычисления fact(0). На этом завершается выполнение выражения 1*fact(0), что возвращает значение fact(1)=1; потом завершается выполнение выражения 2*fact(1), что возвращает значение fact(2)=2, и затем завершается вычисление 3*fact(2), что дает искомый результат 3*2=6.
Контрольные вопросы
Дайте понятие функции.
Что такое определение, прототип и оператор вызова функции?
Зачем нужен прототип функции?
Какие существуют способы передачи параметров функции?
Охарактеризуйте выполнение оператора вызова функции.
Дайте понятие рекурсивной функции.
Объясните понятие шага рекурсии.