Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3-й семестр / Лекции / 2 - Презентация.pptx
Скачиваний:
53
Добавлен:
25.12.2020
Размер:
2.24 Mб
Скачать

Центр дистанционного

обучения

Использование нотации для представления

Вспомним, ранее рассмотренный нами пример “суммирование целых чисел от 1 до n”

• может быть описана в виде последовательности, используя следующее представление:

1

Sum = n + (n-1) + (n-2) + ... + 1 или åi i =n

• В качестве альтернативы могут быть использованы рекурсивные определения (рекуррентные соотношения):

Sum(n) =

ì

n, if

n£1

 

ï

 

í

 

otherwise

 

îïn+ Sum(n- 1),

online.mirea

.ru

Пример: факториалЦентр дистанционного

обучения

• Вычисление факториалов

Определения:

Итеративный способ –

n! =

ì

ï

ï

ï

ï

ï

í

ï

ï

ï

ï

ï

î

1, if n=0

1*2*3*...*n, if n 0

 

Рекурсивный способ –

ì

1, if

n=0

 

 

ï

 

 

í

 

otherwise

 

n! =

îï(n- 1)!*n,

• На Java:

 

 

 

 

 

public int factorial(int n)

 

 

 

 

{

 

 

 

 

 

if (n == 0)

 

 

 

 

 

return 1;

 

 

 

 

 

else return ( n * factorial(n-1));

 

 

}

 

 

 

 

 

 

 

 

online.mirea

 

 

 

 

 

.ru

Центр дистанционного

обучения

Пример: возведение в

степень• Напомним, что стандартая(xJavan)не предоставляет оператора возведения в степень:), поэтому нужно использовать метод pow() класса Math (например, Math.pow(2,3))

Расчет возведения в степень также можно представить с помощью соотношения:

xn = exp(n * ln(x))

• Может также записать рекурсивно:

power(x,n)=

ì

1,

if

n=0

ï

x,

if

n=1

í

ï

otherwise

îx* power(x,n- 1),

publicНа Java:float power(double x, int n { if (n == 0)

return 1.0; else if (n == 1)

return x;

else return ( x * power(x,n-1)); }

// Примечание: непримитивные параметры передаются по ссылке, в Java - массив не дублируется..

online.mirea

.ru

Центр дистанционного

обучения

Использование области видимости!

• В Java:

public int sumArray(int n)

{

//доступ к массиву(в случае списка),

//чтобы суммировать в пределах области видимости;

//n представляет текущее количество элементов в массиве

if (n == 1)

 

return list[0];

 

else return (list[n-1] + sumArray(n-1));

 

}

 

//в других языкаx, где параметры дублируются

 

// доступ к массиву осуществляется через область видимости

online.mirea

 

 

.ru

Центр дистанционного

Последовательныйобучения поиск

элементов в массиве по

заданному значению

• Рекурсивное определение

ì

i, if List[i]=Value

í

 

 

îSearch(List,i+1,Value), otherwise

Search(List, i, Value) =

• Замечание:

(1)Предполагает, что требуемое значение в массиве,

(2)инициал. вызов: positionOfValue = Search(list,0,Value

(3)возвращает позицию массива, если значение находится в массиве

Java

 

public int search(int[] List, int i, int Value)

 

{

 

 

if (List[i] == Value)

 

 

return i;

 

else

return Search(List,i+1,Value);

 

}

online.mirea

 

 

.ru

 

 

 

Центр дистанционного

Последовательный поиск

 

 

 

обучения

 

заданного значенияì

в

 

массиве

í

- 99, if i==numEls

 

• Рекурсивное определение

ï

i, if List[i]==value

 

 

ï

 

 

 

 

ï

 

 

 

Search(List,i,value,numEls) =

ï

 

 

 

 

ïï

Search(List,i+1,Value,numEls), otherwise

 

 

î

 

 

 

• Замечания:

 

 

 

(1)Предполагает, что требуемое значение может и не быть в массиве, возвращается, тогда вовращаем число -99

(2)инициал. вызова: positionOfValue = Search(list,0,value,numEls)

(3)numEls – количество элементов в массиве (его размер)

• Java: public int search(int[] List, int i, int value, int numEls)

{ if (List[i] == value) return i;

else if (i == numEls) return -99;

}

else return Search(List,i+1,value,numEls);

online.mirea

.ru

Ц нтр дистанционного

Другие примеры:обучения

• Риверс строки символов, переданной в качестве параметра s

public void reverse (String s)

{

char t = s.charAt(0); if (s.length() > 1)

reverse(s.substring(1,s.length()));

System.out.print(t);

}

private static void convertToBinary(int x);

{

int t = x/2; // integer divide, truncate remainder

Преобразование целого числа в двоичное

if (t != 0) convertToBinary (t);

System.out.print(x % 2);

}

online.mirea

.ru

Другие примеры:Центр дистанционного

обучения

• Метод, который проверяет, является ли два массива, передаваемые в

 

качестве параметров одинаковыми по величине и содержанию (int n-

размер массива) и возвращает booean.

 

!= y.length)

// different sizes

 

ì false,

if

(x.length

 

í(x[0] ==

y[0]),

if

(n==1)

//

t

|

f only one element

 

ï

 

 

 

 

 

 

 

 

 

 

ï

false,

if

(

x[n- 1]!=y[n- 1])

 

// f , if elements !=

areIdentical(x,y,n) =

ï

areIdentical(x, y,n-

1), otherwise

// continue

 

î

public boolean areIdentical(int[] x, int[] y, int n)

{

if (x.length != y.length) return false;

else if (n == 1)

return (x[0] == y[0]); else if (x[n-1] != y[n-1])

return false;

else return areIdentical(x,y,n-1);

}

online.mirea

.ru

Пример: палиндромЦе тр истанционного

обучения

• Рассмотрим следующий пример – без учета регистра

boolean is_palindrome(String s)

{

// отдельный случай для коротких строк if (s.length() <= 1)

return true;

 

//Получить первый и последний символ

 

char first = s.charAt(0);

 

char last = s.charAt(s.length()-1);

 

if (first == last)

 

{

 

 

//substring(1,s.length(0-1)возвращает строку

 

//между 1st и length-1 (не включая)

 

String shorter = s.substring(1, s.length()-1);

 

return is_palindrome(shorter);

 

}

 

 

else

}

return false;

online.mirea

 

 

 

 

 

.ru

 

Немного другойЦентрпример:дистанционного

обучения

• Что делает следующий метод Java?

public int whoKnows(int[] x, int n)

{

if (n == 1) return x[0]; else

return Math.min(x[n-1], whoKnows(x, n-1));

}

online.mirea

.ru

Соседние файлы в папке Лекции