Docsity
Docsity

Przygotuj się do egzaminów
Przygotuj się do egzaminów

Studiuj dzięki licznym zasobom udostępnionym na Docsity


Otrzymaj punkty, aby pobrać
Otrzymaj punkty, aby pobrać

Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium


Informacje i wskazówki
Informacje i wskazówki

Лабораторная работа 2. Вычислительная рекурсия, Laboratoria z Recykling materiałów

Лабораторная работа 2. Вычислительная рекурсия

Typologia: Laboratoria

2024/2025

Załadowany 03.02.2025

anton-gubernev
anton-gubernev 🇵🇱

1 dokument

1 / 9

Toggle sidebar

Ta strona nie jest widoczna w podglądzie

Nie przegap ważnych części!

bg1
Лабораторная работа № 2
Рекурсия.
Задание
В соответствии со своим вариантом n, где n– порядковый номер студента в списке составить программу,
реализующая рекурсивную(ые) функцию(и).
Вариант
1. Вычислить несколько значений функции Аккермана для неотрицательных чисел m и n:
2. Найти первые N чисел Фибоначчи. Каждое число Фибоначчи равно сумме двух предыдущих
чисел при условии, что первые два равны (1, 1, 2, 3, 5, 8, 13, 21,…), поэтому в общем виде n-е число
можно определить так:
+
==
=.2),2()1(
,2,1,1
)( nеслиnFnF
nkесли
nF
3. Для заданного натурального числа
1N
определить единственное натуральное число
a
, для
которого выполняется неравенство:
.22 1aa N
4. Вычислить определитель матрицы, пользуясь формулой разложения по первой строке:
где матрица Bk получается из A вычеркиванием первой строки и k-го столбца.
5. Напишите рекурсивную функцию для нахождения биномиальных коэффициентов (для заданного
0 jiM
вычислите все
j
i
C
):
6. Пусть даны целое
n
от 2 до 20 и вещественное число
.0E
Найдите с точностью
E
все корни
n
-
го многочлена Чебышева
),(xTn
определяемого формулами:
,1)(
0=xT
,)(
1xxT =
),()(2)( 21 xTxxTxT kkk =
,....)2,1( =k
. Примечание: Многочлен
)(xTk
имеет
k
различных корней в интервале [-1,1]; если
k
xxx ...
21
- корни многочлена
)(xTk
, то многочлен
)(
1xTk+
имеет по одному корню в каждом из интервалов
],,1[ 1
x
],,[ 21 xx
…,
].1,[ k
x
7. Написать процедуру перевода числа из десятичной системы счисления в двоичную.
8. Напишите программу вычисления N-го члена последовательности, начинающейся с единицы в которой
каждый следующий член равен сумме квадратов всех предыдущих.
9. Вычислить, используя рекурсию, выражение
10. Для заданного целого
n
вычислите значение суммы:
= = = +++
n
i
n
i
n
in
niii
1 1 1 21
1 2
.
...
1
...
pf3
pf4
pf5
pf8
pf9

Podgląd częściowego tekstu

Pobierz Лабораторная работа 2. Вычислительная рекурсия i więcej Laboratoria w PDF z Recykling materiałów tylko na Docsity!

Лабораторная работа № 2

Рекурсия.

Задание

В соответствии со своим вариантом n, где n– порядковый номер студента в списке составить программу,

реализующая рекурсивную(ые) функцию(и).

Вариант

  1. Вычислить несколько значений функции Аккермана для неотрицательных чисел m и n:
  2. Найти первые N чисел Фибоначчи. Каждое число Фибоначчи равно сумме двух предыдущих

чисел при условии, что первые два равны (1, 1, 2, 3, 5, 8, 13, 21,…), поэтому в общем виде n-е число

можно определить так:

F n Fn если n

если k n F n

3. Для заданного натурального числа N  1 определить единственное натуральное число a , для

которого выполняется неравенство: 2 2.

a 1 aN

  1. Вычислить определитель матрицы, пользуясь формулой разложения по первой строке:

где матрица Bk получается из A вычеркиванием первой строки и k-го столбца.

  1. Напишите рекурсивную функцию для нахождения биномиальных коэффициентов (для заданного

Mij  0 вычислите все

j

Ci ):

− − − ,.

1 1 C 1 C иначе

приm n

приm n илиm n

C

n m

n m

n m

6. Пусть даны целое n от 2 до 20 и вещественное число E ^0 .Найдите с точностью E все корни n -

го многочлена Чебышева Tn ( x ),определяемого формулами:

T 0 ( x )= 1 , T 1 ( x )= x , Tk ( x )= 2 xTk − 1 ( x )− Tk − 2 ( x ), ( k = 1 , 2 ,....). Примечание : Многочлен Tk ( x ) имеет k

различных корней в интервале [-1,1]; если x 1^ ^ x 2 ... xk - корни многочлена Tk ( x ), то многочлен Tk + 1 ( x )

имеет по одному корню в каждом из интервалов [ − 1 , x 1 ], [ x 1 , x 2 ],…,[^ xk ,^1 ].

  1. Написать процедуру перевода числа из десятичной системы счисления в двоичную.
  2. Напишите программу вычисления N-го члена последовательности, начинающейся с единицы в которой

каждый следующий член равен сумме квадратов всех предыдущих.

  1. Вычислить, используя рекурсию, выражение
  2. Для заданного целого n вычислите значение суммы:

n

i

n

i

n

1 1 21 i^ n^1 i^1 i^2 in

  1. Опишите рекурсивную функцию, которая по заданным вещественному х и целому n вычисляет

величину

n x согласно формуле:

− ( ), 0.

1

||

xx n

n x

n

x

n

n

n

  1. Напишите рекурсивную функцию, которая вычисляет

k

y = x по следующей формуле:

y 0 = 1 , ,

1

1 k

y y

x

y y

k^ n n n n

  • n =^0 ,^1 ,^2 ,...^ За ответ принять приближение, для которого выполняется

условие | y n − yn + 1 | e ,где е = 0 , 0001.

13. Для заданных границ интегрирования a и b вычислите значение определенного интеграла

следующего вида:

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

14. Для заданных границ интегрирования a и b вычислите значение определенного интеграла

следующего вида:

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

15. Для заданных границ интегрирования a и b вычислите значение определенного интеграла

следующего вида:

− −

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

16. Для заданных границ интегрирования a и b вычислите значение определенного интеграла

следующего вида:

программой.

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Из каких частей состоит рекурсивное определение?
  2. Из каких частей состоит рекурсивный алгоритм?
  3. Что такое прямая и косвенная рекурсия?
  4. Сравните итеративную и рекурсивную организацию вычислительного процесса. Чем

они отличаются?

  1. Что такое бесконечная рекурсия? Какова причина ее возникновения?
  2. Что такое уровень рекурсии? Что такое глубина рекурсии?
  3. Каким образом используются фреймы активации в процессе работы рекурсивного

алгоритма?

  1. Что такое бэктрекинг? Как реализуются алгоритмы поиска с возвратом?

Методические рекомендации

Рекурсивное определение алгоритма включает две части:

  1. условия завершения (одно или несколько), которые могут быть вычислены для определенных параметров. Условия завершения соответствуют базисной части рекурсивного определения;
  2. шаг рекурсии , в котором текущие значения некоторых переменных в алгоритме могут быть определены с использованием их предыдущих значений. В конечном итоге шаг рекурсии должен приводить к выполнению условий завершения.

Рекурсивные алгоритмы реализуются через рекурсивные методы (функции). Рекурсивным называется

метод, который в процессе выполнения явно или неявно вызывает сам себя. Прямая (явная) рекурсия

характеризуется наличием в теле метода оператора обращения к нему же самому (рис. 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 поясняет

механизм рекурсивных вычислений.