Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_po_progi_2_sem (1).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
96.34 Кб
Скачать
  1. Понятие рекурсии. Рекурсивное вычисление факториала.

Понятие рекурсии.

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

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

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

В больших и сложных программах иногда приходится заменять рекурсию на итерацию. Дело в том, что рекурсия связана с многократными вызовами процедур, а это несколько менее эффективно при выполнении по сравнению с использованием циклов. Однако рекурсивные версии программ, как правило, гораздо короче и нагляднее.

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

N! = 1*2*3* . . . *(N-2)*(N-1)*N

1! = 1

0! = 1

Пример факториала:

class fact {

static long x=1;

static long n=1;

public static void m(long x, long n){

n=n*x;

x=x+1;

if(x>50){}else{

m(x, n);System.out.println(n+" "+x);}

}

}

  1. Понятие рекурсии. Рекурсивное вычисление суммы элементов массива.

class vuchislFakt{

static int A [] ={1,4,5,7,8,6,8,7,1,71,5,8,9,3,1,4,15,35,65,45,75,95,65,45,78,98,564,25,14,35,45};

static int sum=0;

static int i=-1;

public static void m(){

i++;

sum+=A[i];

if(i==(A.length-1)){System.out.println(sum);}else{

m();}

}

}

  1. Понятие рекурсии. Рекурсивное вычисление максимума в массиве.

class vuchislFakt{

static int A [] ={1,4,5,7,8,6,8,7,1,71,5,8,9,3,1,4,15,35,65,45,75,95,65,45,78,98,564,25,14,35,45};

static int max=0;

static int j=-1;

public static void main(String [] arg){

vuchislFakt vF= new vuchislFakt();

vF.maxArg();

}

public void maxArg(){

j++;

if(max<A[j]){

max=A[j];

}

if(j==(A.length-1)){System.out.println("Максимальный эл. масива:"+max);}else

{ maxArg();

}

}

}

  1. Формулировка задачи о Ханойских башнях.

Формулировка задачи:

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

Минимальное число ходов, необходимое для решения головоломки, равно 2n - 1, где n — число дисков.

Начнём с самого маленького кольца и переложим его на любую отметку. В дальнейшем это кольцо нужно перемещать в том же направлении, что и при первом перекладывании. Затем произведем единственно возможное перемещение оставшихся колец, после чего снова переложим самое маленькое кольцо и т. д. (Интересно заметить, что перенумеровав «кольца» по порядку, мы добьёмся неожиданного эффекта: чётные кольца будут перемещаться из одной вершины треугольника в другую в одном направлении, а не­чётные — в противоположном направлении.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]