Глухих Михаил Игоревич mailto:...

56
Глухих Михаил Игоревич mailto: [email protected]

Upload: others

Post on 08-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Глухих Михаил Игоревичmailto: [email protected]

Page 2: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Рекурсия: прямое или косвенное использование функцией самой себя

2

Page 3: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Рекурсия: прямое или косвенное использование функцией самой себя

Цикл: многократное повторение одного и того же блока в функции

3

Page 4: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = n(n-1)!

4

Page 5: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = n(n-1)!

0! = 1, 1! = 1

5

Page 6: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = n(n-1)!

0! = 1, 1! = 1 (база)

6

Page 7: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = n(n-1)!

0! = 1, 1! = 1 (база)

fun factorial(n: Int): Double =

if (n < 2) 1.0 else n * factorial(n - 1)

7

Page 8: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

8

Page 9: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

Решение: разбить число N на◦ Младшую цифру

◦ Все остальные цифры

9

Page 10: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

Решение: разбить число N на◦ Младшую цифру N % 10

◦ Все остальные цифры N / 10

Для числа из одной цифры задача тривиальна

10

Page 11: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

fun digitCountInNumber(n: Int, m: Int): Int =

if (n == m) 1

else if (n < 10) 0

else digitCountInNumber(n / 10, m) +

digitCountInNumber(n % 10, m)

11

Page 12: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Первое равно 1, второе тоже 1

F(N+2) = F(N) + F(N+1)

Напрашивается рекурсивное решение?

12

Page 13: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Первое равно 1, второе тоже 1

F(N+2) = F(N) + F(N+1)

Напрашивается рекурсивное решение?

На самом деле возможны проблемы…

13

Page 14: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = 1 * 2 * … * (n-1) * n

14

Page 15: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = 1 * 2 * … * (n-1) * n

fun factorial(n: Int): Double {

var result = 1.0

for (i in 1..n) {

result = result * i

}

return result

}

15

Page 16: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = 1 * 2 * … * (n-1) * n

fun factorial(n: Int): Double {

var result = 1.0

for (i in 1..n) {

result = result * i

}

return result

}

// for = цикл: для (каждого) i в (интервале) 1..n …

16

Page 17: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

n! = 1 * 2 * … * (n-1) * n

fun factorial(n: Int): Double {

var result = 1.0

for (i in 1..n) {

result = result * i

}

return result

}

// for = цикл: для (каждого) i в (интервале) 1..n …

// var = мутирующая переменная (или просто переменная)

17

Page 18: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

fun factorial(n: Int): Double {

var result = 1.0

for (i in 1..n) {

result *= i // result = result * i

}

return result

}

18

Page 19: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

+= увеличить на ...

-= уменьшить на ...

*= домножить на ...

/= разделить и присвоить

%= взять остаток от деления и присвоить

19

Page 20: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

20

Page 21: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

fun foo() {

var a = 3

val b = a++

}

21

Page 22: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

fun foo() {

var a = 3

val b = a++ // a = 4, b = 3

}

22

Page 23: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

fun foo() {

var a = 3

val b = ++a

}

23

Page 24: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

fun foo() {

var a = 3

val b = ++a // a = 4, b = 4

}

24

Page 25: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

Значение a++ или a--равно старому значению a

25

Page 26: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

a++ или ++a – увеличить на 1

a-- или --a – уменьшить на 1

Значение a++ или a--равно старому значению a

А значение ++a или --a равно новому значению a

26

Page 27: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

// Заголовок

for (i in 1..10) {

// Тело цикла

}

27

Page 28: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

// Заголовок

for (i in 1..10) {

// Тело цикла

}

// Итерация = одно выполнение тела

28

Page 29: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for (i in 1..10) { … } // интервал

29

Page 30: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for (i in 1..10) { … } // интервал

for (i in 10 downTo 1) { … } // прогрессия

30

Page 31: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for (i in 1..10) { … } // интервал

for (i in 10 downTo 1) { … } // прогрессия

for (i in 1..99 step 2) { … } // прогрессия

31

Page 32: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for (i in 1..10) { … } // интервал

for (i in 10 downTo 1) { … } // прогрессия

for (i in 1..99 step 2) { … } // прогрессия

for (i in 100 downTo 2 step 2) { … } // прогрессия

32

Page 33: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for (i in 1..10) { … } // интервал

for (i in 0 until 10) { … } // интервал от 0 до 9 (!)

for (i in 10 downTo 1) { … } // прогрессия

for (i in 1..99 step 2) { … } // прогрессия

for (i in 100 downTo 2 step 2) { … } // прогрессия

33

Page 34: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

34

Page 35: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

Проверка на простоту: убедиться, что в интервале 2..N-1 нет ни одного делителя

35

Page 36: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

Проверка на простоту: убедиться, что в интервале 2..N-1 нет ни одного делителя

fun isPrime(n: Int): Boolean {

if (n < 2) return false

for (m in 2..n - 1) {

if (n % m == 0) return false

else return true

}

}

36

Page 37: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

Проверка на простоту: убедиться, что в интервале 2..N-1 нет ни одного делителя

fun isPrime(n: Int): Boolean {

if (n < 2) return false

for (m in 2..n - 1) {

if (n % m == 0) return false

else return true

}

return true

}

37

Page 38: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

Проверка на простоту: убедиться, что в интервале 2..N-1 нет ни одного делителя

fun isPrime(n: Int): Boolean {

if (n < 2) return false

for (m in 2..n - 1) {

if (n % m == 0) return false

}

return true

}

38

Page 39: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Число N простое, если у него ровно 2 делителя: 1 и N

Проверка на простоту: убедиться, что в интервале 2..N-1 нет ни одного делителя

fun isPrime(n: Int): Boolean {

if (n < 2) return false

for (m in 2 until n) {

if (n % m == 0) return false

}

return true

}

39

Page 40: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Оператор break используется, если необходимо прервать выполнение цикла

40

Page 41: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Оператор break используется, если необходимо прервать выполнение цикла

Оператор continue используется, если необходимо завершить текущую итерациюцикла и продолжить цикл со следующей итерации

41

Page 42: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Совершенное число равно сумме всех своих делителей, кроме него самого

42

Page 43: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Совершенное число равно сумме всех своих делителей, кроме него самого

6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14

43

Page 44: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Совершенное число равно сумме всех своих делителей, кроме него самого

6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14

fun isPerfect(n: Int): Boolean { var sum = 1 for (m in 2..n/2) {

if (n % m == 0) { sum += m if (sum > n) break

} } return sum == n

}

44

Page 45: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Совершенное число равно сумме всех своих делителей, кроме него самого

6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14

fun isPerfect(n: Int): Boolean { var sum = 1 for (m in 2..n/2) {

if (n % m > 0) continue sum += m if (sum > n) break

} return sum == n

}

45

Page 46: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

for = цикл с фиксированным количеством итераций (не считая break / return)

while = цикл с неопределённым количеством итераций

do…while = то же, но с другим порядком выполнения

46

Page 47: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

fun digitCountInNumber(n: Int, m: Int): Int { var count = 0 var number = n while (number > 0) {

if (m == number % 10) { count++

}number /= 10

}return count

}

47

Page 48: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Сколько раз цифра M входит в число N ≥ 0?

fun digitCountInNumber(n: Int, m: Int): Int { var count = 0 var number = n do {

if (m == number % 10) { count++

}number /= 10

} while (number > 0)return count

}

48

Page 49: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

while = цикл с предусловием (тело может не выполниться ни разу)

do … while = цикл с постусловием (тело обязано выполниться хотя бы раз)

Условие = ВСЕГДА условие продолжения

49

Page 50: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

В реальном мире программисты часто используют чужой код◦ В виде подключаемых библиотек (лучше)

◦ В виде copy-paste

50

Page 51: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

В реальном мире программисты часто используют чужой код◦ В виде подключаемых библиотек (лучше)

◦ В виде copy-paste

Права? Зависят от лицензии

51

Page 52: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

В реальном мире программисты часто используют чужой код◦ В виде подключаемых библиотек (лучше)

◦ В виде copy-paste

Права? Зависят от лицензии◦ Иногда можно как угодно

◦ Иногда можно только в виде библиотеки

◦ Иногда можно только за деньги

◦ Иногда можно только с разрешения владельца кода

◦ Иногда нужно иметь ту же лицензию

52

Page 53: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

В реальном мире программисты часто используют чужой код◦ В виде подключаемых библиотек (лучше)

◦ В виде copy-paste

Права? Зависят от лицензии

А как у нас?◦ Copy-paste чужого кода допускается *только* с

явной ссылкой на источник

◦ Плюс ограничения владельца

◦ Выставляемая оценка зависит от своего кода, а не заимствованного

53

Page 54: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Плагиат – использование чужого кода с нарушением лицензии

Как определить, что ваш код незаконно использован? Есть специальные методы и программы

54

Page 55: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

Плагиат – использование чужого кода с нарушением лицензии

Как определить, что ваш код незаконно использован? Есть специальные методы и программы

WARNING◦ В Котоед такая программа встроена

55

Page 56: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2018/kaf/Kotlin03.pdf · a++ или ++a –увеличить на 1 a-- или --a

См. lesson3/task1 в обучающем проекте Решите хотя бы одно из заданий Протестируйте решение с помощью

готовых тестов Добавьте ещё хотя бы один тестовый

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

решение хотя бы одной задачи Добавьте коммит в свой репозиторий Создайте Kotoed Submission и убедитесь в

правильности решения

56