Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 4:

Рекурсивные функции

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Лабораторная работа 3. Рекурсивные функции.

Цель работы: изучить понятия рекурсии, рекурсивные функции в программировании, приемы построения рекурсивной триады при решении задач, научиться применять рекурсивные методы в решении задач на языке С++.

При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи (ввод данных сопровождайте диалогом). Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.

Теоретические сведения.

Ознакомьтесь с материалом лекции 3.

Задания к лабораторной работе.

Выполните приведенные ниже задания.

  1. Определите закономерность формирования членов последовательности. Найдите n -ый член последовательности: 1, 1, 2, 3, 5, 8, 13, ...
  2. Составьте программу вычисления биномиального коэффициента C_m^n для данных неотрицательных целых m, n (m\geq n): C_m^n=\frac{m!}{n!\cdot (m-n)!}. Решите задачу двумя способами: 1 – используйте функцию вычисления факториала; 2 – выразите вычисление C_m^n через C_{m-1}^{n-1}.
  3. Исполнитель умеет выполнять два действия: "+1", "*2". Составьте программу получения из числа 1 числа 100 за наименьшее количество операций.
  4. Найдите наибольший общий делитель двух натуральных чисел с помощью алгоритма Евклида.
  5. Дано натуральное число, кратное 3. Получите сумму кубов этого числа, затем сумму кубов получившегося числа и т.д. Проверьте на нескольких примерах, действительно ли в конечном итоге получится 153.
  6. Разработайте программу вычисления an натуральной степени n вещественного числа a за наименьшее число операций.

Указания к выполнению работы.

Каждое задание необходимо решить в соответствии с изученными рекурсивными методами решения задач и методами обработки числовых данных в языке С++. Перед реализацией кода каждой задачи необходимо разработать рекурсивную триаду в соответствии с постановкой задачи. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя рекурсивные функции. Этапы сопроводить комментариями в коде.

Следует реализовать каждое задание в соответствии с приведенными этапами:

  • изучить словесную постановку задачи, выделив при этом все виды данных;
  • сформулировать математическую постановку задачи;
  • выбрать метод решения задачи, если это необходимо;
  • разработать графическую схему алгоритма;
  • записать разработанный алгоритм на языке С++;
  • разработать контрольный тест к программе;
  • отладить программу;
  • представить отчет по работе.

Требования к отчету.

Отчет по лабораторной работе должен соответствовать следующей структуре.

  • Титульный лист.
  • Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
  • Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
  • Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
  • Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
  • Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
  • Выводы по лабораторной работе.
  • Ответы на контрольные вопросы.

Контрольные вопросы

  • Приведите примеры рекурсивных объектов и явлений. Обоснуйте проявление рекурсивности.
  • Почему при правильной организации рекурсивные вызовы не зацикливаются?
  • Почему не отождествляются совпадающие идентификаторы при многократных рекурсивных вызовах?
  • Почему рекурсивные обращения завершаются в порядке, обратном вызовам этих обращений?
  • Чем ограничено при выполнении программы количество рекурсивных вызовов?
  • Какой из методов в программировании является более эффективным – рекурсивный или итерационный?
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!