- •2008 № I информатика
- •2008 № 4 Информатика
- •2. Статья "Частотный анализ"
- •1. Общие вопросы
- •2. Особенности выполнения рекурсивных алгоритмов
- •3. Рекурсивные функции и процедуры для обсуждения
- •2008 Nt 5 информатика
- •4. Задания на использование рекурсии
- •2008 № 5 Информатика
- •2008 N» 5 информатика
- •2008 N» 5 информатика
- •2008 № 5 Информатика
- •5. Прямая и косвенная рекурсия
- •5. Формы рекурсивных процедур6
- •2008 № 5 Информатика
2008 N» 5 информатика
1 |
"I |
л |
•Л' |
|
1 |
|
1" |
ри и ™ 0;
, при п> 0;
при п •
Рекурсивная функция:
Function Power(a: real; n: integer): real;
Begin
If n = 0 Then Power :- 1 Else
If n > 0 Then Power := a * Power (a, n - 1)
Else Power := l/(Power(a, Abs(n)))
End;
Примечание. Целесообразно обсудить с учащимися последовательность вызовов и использования приведенной функции при отрицательных значениях tu например, и ■■ —э-
11. Разработать программу для нахождения наибольшего общего делителя (НОД) двух заданных натуральных чисел.
Решение
Можно применить алгоритм Евклида нахождения НОД. Его суть в следующем: "Если два заданных числа равны, то в качестве ответа взять любое, иначе большее из чисел заменить разностью большего и меньшего".
В аналитическом виде алгоритм Евклида выглядит следующим образом:
W , При П — 171
N0D(m,n) = lN0D(m-n,n), при т> п [N0D(m,n-m), при п> т.
Рекурсивная функция, реализующая этот алгоритм:
Function N0D(a, b: word): word;
Begin
If a = b Then NOD := a
Else
If a > b Then NOD := N0D(a - b, b)
Else NOD := NOD (a, b - a) End;
12. Разработать программу для определения значения минимального элемента массива.
Решение
Опишем функцию MinK, которая определяет минимум в массиве а из к элементов. Ясно, что если к = 2, то результат равен минимальному из первых двух элементов массива. Если же к > 2, то результатом является минимальное из двух чисел: последнего элемента такого массива и минимального числа из первых (к - 1) элементов массива. Второе из сравниваемых чисел можно найти с помощью той же функции MinK (рекурсивный вызов).
CivMioVmi тпухчцая рекурсивная функция
Tunction MinKlk: byte) : integer;
Begin
If к - 2 Then MinK :- MinlalU, a|k)) Zlee MinK :« Min(a[k), MinK(lc - i)>
End;
Минимальное из двух чисел определяется с помощью функции Min, параметрами которой являются эти
числа:
Function Min(a, b: integer): integer; Begin
If a > b Then Min :=■ b
Else Min : = a End;
Чтобы найти минимум среди всех элементов заданного массива, нужно вызвать функцию MinK указав в качестве фактического параметра размер массива.
Or редакции. Можно в заголовке функции использовать только один параметр — к, а в ее теле значение last заменить на <Щ
Function MinK(k: byte): integer;
Begin
If k = 2 Then MinK := Min(a[l], a[2]) Klse MinK := Min(a[k], MinK(k - 1))
End;
13. Разработать программу для определения индекса минимального элемента массива.
Решение
Если в массиве два элемента {к = 2), то результатом является индекс одного из двух первых элементов. Если же п > 2, то результат определяется путем сравнения двух элементов: к-го и того, который является минимальным среди первых (к — 1) элементов массива. Индекс второго из сравниваемых чисел можно найти, используя рекурсию.
Соответствующая рекурсивная функция: щ
Function IndMinK(k: byte): byte;
Begin
If k = 2 Then IndMinK := IndMin2(l, k) Else IndMinK := IndMin2(k, IndMinK(k - D)
End;
— где IndMin2 — функция определения индекса минимального из двух элементов массива с заданными
индексами:
Function IndMin2(indl, ind2: byte): byte;
(indl, ind2 - индексы сравниваемых элементов)
Begin
If a[indl]< a[ind2] Then IndMin2 := indl Else IndMin2 := ind2
End;
Примечание. Целесообразно предложить учащимся подумать над вопросом: "Индекс какого элемента будет найден, если в массиве есть несколько элементов с минимальным значением?".
-
Используя оператор write (а) лишь при'й = 0..9, разработать программу вывода на экран десятичной записи заданного натурального числа п.