Скачать презентацию Функции в Си Рекурсия Лекция 2 Функции Скачать презентацию Функции в Си Рекурсия Лекция 2 Функции

Л2_функции_рекурсия.pptx

  • Количество слайдов: 23

Функции в Си Рекурсия Лекция 2 Функции в Си Рекурсия Лекция 2

Функции в Си 1) это один из производных типов; 2) минимальный исполняемый модуль программы. Функции в Си 1) это один из производных типов; 2) минимальный исполняемый модуль программы. Определение функции: тип имя_функции (спецификация_параметров) тело_функции тип – либо void либо тип возвращаемого функцией значения имя_функции – либо main , либо идентификатор спецификация_параметров – либо пусто, либо список формальных параметров, каждый из которых имеет вид: обозначение_типа имя параметра тело_функции – часть определения функции, заключенная в фигурные скобки, может быть либо составным оператором либо блоком.

Оператор возврата из функции return; return выражение; Примеры: int summ(int a, int b) { Оператор возврата из функции return; return выражение; Примеры: int summ(int a, int b) { int c; c = a + b; return c; } float ft(double x, int n) { if (x

Вызов функции обозначение_функции (список_фактических_параметров) • Передача параметров осуществляется по значению. • Нельзя в теле Вызов функции обозначение_функции (список_фактических_параметров) • Передача параметров осуществляется по значению. • Нельзя в теле функции описать другую функцию, т. е. все функции описываются на одном уровне.

Пример void print (int gg, int mm, int dd) { printf(“n год: %d”, gg); Пример void print (int gg, int mm, int dd) { printf(“n год: %d”, gg); printf(“, t месяц: %d”, mm); printf(“, t день: %d. ”, dd); } Обращение к функции: print(2012, 2, 13); Вывод на экран: год: 2012, месяц: 2, день: 13.

Рекурсия Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя. Рекурсия Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя.

Примеры рекурсии в повседневной жизни Определение родственных отношений X и Y являются родственниками: • Примеры рекурсии в повседневной жизни Определение родственных отношений X и Y являются родственниками: • либо, если Y – отец, мать, сын или дочь X (или супруг, если включать степень родства по браку) • либо, если существует такой Z, что X является родственником Z, а Z является родственником Y. Вопрос: почему отпадает необходимость включать случай, когда X является братом или сестрой Y?

Примеры рекурсии в повседневной жизни ВЫЯСНЕНИЕ ЗНАЧЕНИЯ СЛОВА: 1. Найти слово в словаре. 2. Примеры рекурсии в повседневной жизни ВЫЯСНЕНИЕ ЗНАЧЕНИЯ СЛОВА: 1. Найти слово в словаре. 2. Прочитать статью, объясняющую значение этого слова. 3. Если объяснение понятно, т. е. статья не содержит непонятных слов, продолжить чтение с последнего прерванного места. 4. Если в объяснении встречается незнакомое слово, прекратить чтение, запомнить место прекращения и выяснить значение слова, придерживаясь правил ВЫЯСНЕНИЕ ЗНАЧЕНИЯ СЛОВА.

Примеры рекурсии в природе • Деревья имеют рекурсивное строение (ветки образуются из других веток). Примеры рекурсии в природе • Деревья имеют рекурсивное строение (ветки образуются из других веток). • Реки образуются из впадающих в них рек. • Клетки делятся рекурсивно. • Молекулы ДНК и вирусы размножаются , копируя себя. • Живые существа имеют потомство, которое, в свою очередь, тоже имеет потомство.

Примеры рекурсии в естественном языке • «Петя сказал, что Вася сказал, что…» • «Знаю, Примеры рекурсии в естественном языке • «Петя сказал, что Вася сказал, что…» • «Знаю, что знаю, но не помню» • «Сделать, заставить сделать, заставить, чтобы заставили сделать; …» • «Замени X этим предложением. »

Примеры рекурсии в математике, рекуррентные соотношения 1. Натуральные числа: a) 1 – натуральное число; Примеры рекурсии в математике, рекуррентные соотношения 1. Натуральные числа: a) 1 – натуральное число; b) Число, следующее за натуральным, есть натуральное число. 2. Функция «факториал» n! (для неотрицательных чисел): a) 0! = 1, b) n!= n*(n − 1)! (n > 0) 3. Числа Фибоначчи: a) F 0 = 1; b) F 1 = 1; c) Fn+2 = Fn + Fn+1 , n ≥ 0.

Рекурсия в программировании Мощность рекурсивного определения заключается в том, что оно позволяет с помощью Рекурсия в программировании Мощность рекурсивного определения заключается в том, что оно позволяет с помощью конечного высказывания определить бесконечное множество объектов. С помощью конечной рекурсивной программы можно описать бесконечное вычисление, причем программа не будет содержать явных повторений. Если некоторая процедура P содержит явную ссылку на саму себя, то ее называют прямо рекурсивной. Если же P ссылается на другую процедуру Q, содержащую (прямую или косвенную )ссылку на P, то P называют косвенно рекурсивной. Задача особенно удобна для рекурсивного анализа, если она может быть разложена на совокупность подзадач меньшей размерности.

Общая методика рекурсивного анализа задачи 1. Параметризация задачи Выделение различных элементов, от которых зависит Общая методика рекурсивного анализа задачи 1. Параметризация задачи Выделение различных элементов, от которых зависит решение, и, в частности, размерности решаемой задачи, причем размерность должна убывать после каждого рекурсивного вызова. 2. Поиск тривиального случая и его решение Часто это ключевой этап алгоритма, который может быть разрешен непосредственно без рекурсивного вызова. При этом размерность задачи нулевая или равна 1 и т. п. 3. Декомпозиция общего случая Приведение задачи к одной или нескольким задачам, в основном более простым (меньшей размерности).

Пример. Задача Ханойские башни (Towers of Hanoi) A B C Цель игры – перенесение Пример. Задача Ханойские башни (Towers of Hanoi) A B C Цель игры – перенесение всех дисков на стержень B по следующим правилам: 1. За один раз можно перенести только один диск. 2. Больший по размеру диск нельзя положить на меньший

Алгоритм задачи Ханойские башни 1. Перенести со стержня А N-1 дисков на вспомогательный стержень Алгоритм задачи Ханойские башни 1. Перенести со стержня А N-1 дисков на вспомогательный стержень С (задача Ханойские башни для N-1). 2. Перенести нижний диск со стержня А на стержень В. 3. Перенести со стержня С N-1 дисков на стержень В (задача Ханойские башни для N-1). A B C

Поиск рекурсивного решения задачи Ханойские башни 1. параметризация: Параметры – число дисков n и Поиск рекурсивного решения задачи Ханойские башни 1. параметризация: Параметры – число дисков n и стержни x (исходный), y (конечный), z (промежуточный) программа Ханой (аргументы n: ЦЕЛОЕ, x, y, z : СТЕРЖНИ) Решение задачи дается с помощью вызова Ханой(64, ‘A’, ‘B’, ‘C’); 2. поиск тривиальных случаев (n=0) если n > 0 то { обработка общего случая } иначе {ничего не делать} 3. редукция общего случая к более простому Ханой (n – 1, x, z, y); переместить(x, y); Ханой (n – 1, z, y, x);

Каково количество элементарных перемещений ? ND (0) = 0 ND (n) = 2 ND(n Каково количество элементарных перемещений ? ND (0) = 0 ND (n) = 2 ND(n – 1 ) + 1, для n > 0 ND (n) = 2 n – 1. 264 1020

Реализация процедур с рекурсией В основе лежит стек. Пусть выполняется процедура А. Стек выглядит Реализация процедур с рекурсией В основе лежит стек. Пусть выполняется процедура А. Стек выглядит так: Фрагмент стека для основной программы … Фрагмент стека для процедуры, вызвавшей А Вершина стека Фрагмент стека для этого вызова А

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

Реализация процедур с рекурсией, продолжение Когда процедура В кончает работу, управление передается процедуре А: Реализация процедур с рекурсией, продолжение Когда процедура В кончает работу, управление передается процедуре А: a) адрес возврата извлекается из вершины стека, b) если В – функция, то значение, обозначенное выражением из return-оператора, запоминается в ячейке, предписанной адресом значения в стека, c) фрагмент стека процедуры В выталкивается из стека(это ставит в вершину стека фрагмент процедуры А), d) выполнение процедуры А возобновляется в ячейке, указанной в адресе возврата.

Лабораторная работа № 2 Определение Многочлен вида называется биномом Ньютона, а коэффициенты (0 m Лабораторная работа № 2 Определение Многочлен вида называется биномом Ньютона, а коэффициенты (0 m n) называются биномиальными коэффициентами. Задание Используя два описанных ниже метода, найти значения коэффициентов разложения многочлена (a + b)n. Входные данные С клавиатуры вводится число n — значение максимальной степени, для которой нужно посчитать коэффициенты бинома Ньютона. Выходные данные На экран выводятся n + 1 строк. Каждая i – я строка (0 i n ) содержит целые числа, записанные через пробел, — посчитанные биномиальные коэффициенты Cik (0 k i).

Метод 1. Треугольник Паскаля Выпишем коэффициенты разложения в строчку, начиная с n = 0, Метод 1. Треугольник Паскаля Выпишем коэффициенты разложения в строчку, начиная с n = 0, 1 и так далее следующим образом: n | Коэффициенты 0 | 1 1 2 | 1 2 1 3 | 1 3 3 1 4 | 1 4 6 4 1 5 | 1 5 10 10 5 1 6 | 1 6 15 20 15 6 1 7 |1 7 21 35 35 21 7 1. . . |. . . Для каждого коэффициента можно записать следующие рекуррентные соотношения:

Метод 2. С использованием рекурсивной функции вычисления факториала Биномиальные коэффициенты также можно вычислить по Метод 2. С использованием рекурсивной функции вычисления факториала Биномиальные коэффициенты также можно вычислить по следующей формуле (число сочетаний из n по k): где выражение n! (n-факториал) обозначает произведение всех натуральных чисел от 1 до n. Исходя из соотношений: 0! = 1, n!= n*(n − 1)! (n > 0) можно написать рекурсивную функцию вычисления факториала, а затем использовать ее для вычисления биномиальных коэффициентов по приведенной выше формуле. int faсt(int n) { if (!n) return 1; return (n * faсt(n-1)); }