





Studiuj dzięki licznym zasobom udostępnionym na Docsity
Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium
Przygotuj się do egzaminów
Studiuj dzięki licznym zasobom udostępnionym na Docsity
Otrzymaj punkty, aby pobrać
Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium
Społeczność
Odkryj najlepsze uniwersytety w twoim kraju, według użytkowników Docsity
Bezpłatne poradniki
Pobierz bezpłatnie nasze przewodniki na temat technik studiowania, metod panowania nad stresem, wskazówki do przygotowania do prac magisterskich opracowane przez wykładowców Docsity
Лабораторная работа 2. Вычислительная рекурсия
Typologia: Laboratoria
1 / 9
Ta strona nie jest widoczna w podglądzie
Nie przegap ważnych części!
Лабораторная работа № 2
Рекурсия.
Задание
В соответствии со своим вариантом n, где n– порядковый номер студента в списке составить программу,
реализующая рекурсивную(ые) функцию(и).
Вариант
чисел при условии, что первые два равны (1, 1, 2, 3, 5, 8, 13, 21,…), поэтому в общем виде n-е число
можно определить так:
F n Fn если n
если k n F n
которого выполняется неравенство: 2 2.
a 1 a N
−
где матрица Bk получается из A вычеркиванием первой строки и k-го столбца.
M i j 0 вычислите все
j
− − − ,.
1 1 C 1 C иначе
приm n
приm n илиm n
C
n m
n m
n m
каждый следующий член равен сумме квадратов всех предыдущих.
n
i
n
i
n
1 1 21 i^ n^1 i^1 i^2 in
величину
n x согласно формуле:
− ( ), 0.
1
||
xx n
n x
n
x
n
n
n
k
1
1 k
y y
x
y y
k^ n n n n
−
следующего вида:
−
−
cos , 1 ;
sin 2 , 2 , 4
sin , 2 ,
sin cos 1
sin
2
1
x n
x n
x
xdx n n
n
n
x x
xdx
n
n
n
следующего вида:
−
−
sin , 1 ;
sin 2 , 2 , 4
cos , 2 ,
cos sin 1
cos
2
1
x n
x n
x
xdx n n
n
n
x x
xdx
n
n
n
следующего вида:
− −
ln
1 sin
sin
cos
1
sin
1 2
x n
n
x tg
n x
dx
n
n
x
x
n
x
dx
n n
n
следующего вида:
программой.
они отличаются?
алгоритма?
Методические рекомендации
Рекурсивное определение алгоритма включает две части:
Рекурсивные алгоритмы реализуются через рекурсивные методы (функции). Рекурсивным называется
метод, который в процессе выполнения явно или неявно вызывает сам себя. Прямая (явная) рекурсия
характеризуется наличием в теле метода оператора обращения к нему же самому (рис. 1 .а). В случае
косвенной (неявной) рекурсии один метод обращается к другому, который (возможно через цепочку
вызовов других методов) вновь обращается к первому методу (рис. 1 .б). Далее будем рассматривать только
прямую рекурсию.
а б
Рис. 1. Схема прямой и косвенной рекурсии: а – прямая рекурсия; б – косвенная рекурсия
Итеративная и рекурсивная схема организации вычислительного процесса
Для того чтобы лучше понять особенности рекурсивных алгоритмов, полезно сопоставить итеративную и
рекурсивную организацию процесса вычислений в программе. Особенности итеративного и рекурсивного
вычислительного процесса рассмотрим на примере вычисления значения факториала некоторого
натурального числа N.
Итеративная схема организации вычислительного процесса
Итеративный процесс можно проиллюстрировать с помощью схемы, приведенной на рис. 2. Этот процесс
состоит из четырех блоков: инициализации, принятия решения (о продолжении вычислений), вычисления
и модификации.
Метод A
Метод A Метод B Метод C
Рис. 2. Схема итеративного вычислительного процесса
В основе итеративного вычислительного процесса лежит итеративный цикл While (с предусловием или
постусловием) , For.
Наиболее универсальным является цикл While :
While < условие цикла > < тело цикла >;
Итеративная схема вычисления факториала: N! = 1 * 2 * 3 * … * N.
Метод, реализующий итеративную схему вычисления факториала, приведен ниже:
using System;
namespace Iteration
{
class Iteration
{
public static long Iter_fact( int n )
{
int i =1; long f =1; // инициализация
while ( i < = n ) // решение о завершении
{
f = f * i; // вычисления
i++; // модификация
}
return f;
}
static void Main()
{
Console.Write( “Введите целое число: “ );
int x = Convert.ToInt32(( Console.ReadLine() );
long y = Iter_fact( x);
if < условие цикла >
{
< тело рекурсивного цикла; > Recursion Cycle (…);
}
}
В теле рекурсивного цикла (в блоке промежуточных вычислений) обязательно должны содержаться
операторы, изменяющие значения переменных, от которых зависит условие завершения рекурсивного
цикла.
Выполнение условия завершения рекурсивного цикла соответствует достижению базиса рекурсивного
определения. Если значения этих переменных не успевают измениться в теле цикла до очередной
активации рекурсивного метода, то возникает бесконечный рекурсивный цикл.
Общая схема бесконечного рекурсивного цикла:
[спецификаторы] тип Infinite Recursion_Cycle (…)
{
if < условие цикла >
{
Infinite Recursion_Cycle (…);
< тело рекурсивного цикла; >
}
}
Рекурсивная схема вычисления факториала:
Базисная часть:
0! = 1; 1! = 1;
Рекурсивная часть:
N! = N * ( N-1 )! = N * ( N-1 ) * ( N-2 )! = N * ( N-1 ) * … * ( N – ( N-1 ) )! =
Промежуточные вычисления и обращения метода к самому себе
Окончательные вычисления
Метод, реализующий рекурсивную схему вычисления факториала:
using System;
namespace Recursion
{
class Recursion
{
public static long Recurs_fact( int n )
{
long f;
if ( n == 0 || n == 1) // принятие решения о завершении вычислений:
f = 1; // да^ –^ окончательные вычисления для базисной части
else
= N * ( N-1 ) * ( N-2) *... * 2 *
1! Базисная часть 1!=
f = Recurs_fact ( n-1); // нет^ –^ промежуточные^ вычисления^ и обращение метода к самому себе
f = f * n; // окончательные вычисления для рекурсивной части { адрес
возврата после завершения активации }
}
return f;
} // завершение активации
static void Main()
{
Console.Write( “Введите целое число: “ );
int x = int.Parse( Console.ReadLine() );
long y = Recurs_fact( x );
Console.WriteLine( “Рекурсивный факториал = {0}”, y );
}
}
}
С каждым обращением к рекурсивному методу ассоциируется номер уровня рекурсии (номер фрейма
активации). Считается, что при первоначальном вызове рекурсивного метода из основной программы
номер уровня рекурсии равен единице. Каждый следующий вход в метод имеет номер уровня на единицу
больше, чем номер уровня метода, из которого производится это обращение.
Другой характеристикой рекурсивного метода является глубина рекурсии , определяемая максимальным
уровнем рекурсии в процессе вычисления при заданных аргументах. В общем случае эта величина
неочевидна, исключение составляют простые рекурсивные методы, например, при вычислении значения
N! глубина рекурсии равна N.
Так как при выходе из текущей активации самым первым должен быть восстановлен фрейм, который был
позже всех сохранен, для хранения фреймов используется область системного стека. Рисунок 4 поясняет
механизм рекурсивных вычислений.