русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-07-04; просмотров: 674; Нарушение авторских прав


В окружающем нас мире часто можно встретить объекты, обладающие самоподобием. То есть часть большого объекта в чем-то сходна с самим объектом. Например, ветка дерева повторяет форму и характер ветвления, схожие с самим деревом. Приведенные ниже графические объекты также обладают самоподобием. Такие объекты называются рекурсивными.

 

 

В языках программирования процедурной парадигмы предусмотрено использование рекурсивных функций в решении задач.

Функция называется рекурсивной, если в своем теле она содержит обращение к самой себе с измененным набором параметров. При этом количество обращений конечно, так как в итоге решение сводится к базовому случаю, когда ответ очевиден.

Пример 1. В арифметической прогрессии найдите an, если известны а1= -2.5, d=0.4, не используя формулу n-го члена прогрессии.

 

По определению арифметической прогрессии, an= an-1+ d, при этом

an-1= an-2+ d, an-2= an-3+ d,… a2= a1+ d.

Таким образом, нахождение an для номера n сводится к решению аналогичной задачи, но только для номера n-1, что в свою очередь сводится к решению для номера n-2, и так далее, пока не будет достигнут номер 1 (значение а1дано по условию задачи).

float arifm (int n, float a, float d) {

if (n<1) return 0; // для неположительных номеров

if (n==1) return a; // базовый случай: n=1

return arifm(n-1,a,d)+d; // общий случай

}

Пояснение к примеру.

В рекурсивных функциях несколько раз используется return.В базовом случае возвращается конкретный результат (в примере – значение а), а общий случай предусматривает вызов функцией себя же, но с меняющимися значениями отдельных параметров (в примере изменяется только номер члена последовательности, при этом не меняются разность и первый член прогрессии).

Для решения задач рекурсивными методами разрабатывают следующие этапы, образующие рекурсивную триаду:



● параметризация – выделяют параметры, которые используются в решении;

● база рекурсии – определяют тривиальный случай, при котором решение очевидно;

● декомпозиция – выражают общий случай через подзадачи с измененными параметрами.

Пример 2. Для целого неотрицательного числа n найдите его факториал.

Разработаем рекурсивную триаду.

Параметризация: n – неотрицательное целое число.

База рекурсии: для n=0 факториал равен 1.

Декомпозиция: n!=(n-1)!*n.

long factor (int n) {

if (n<0) return 0; // для отрицательных чисел

if (n==0) return 1; // базовый случай: n=0

return factor(n-1)*n; // общий случай (декомпозиция)

}

 

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

Пример 3. Дан прямоугольник, стороны которого выражены натуральными числами. Разрежьте его на минимальное число квадратов с натуральными сторонами.

#include <stdio.h>

int kv(int m,int n);

void main(){

int a,b,k;

printf("Введите стороны прямоугольника->");

scanf("%d%d",&a,&b);

k = kv(a,b);

printf("Прямоугольник со сторонами %d и %d можно

разрезать на %d квадратов",a,b,k);

}

int kv(int m,int n){

if(m==n) return 1;

if(m>n) return 1+kv(m-n,n);

return 1+kv(m,n-m);

}

 



<== предыдущая лекция | следующая лекция ==>
Домашние задания | Задания


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.782 сек.