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

Post on 08-Jul-2020

6 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

2

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

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

3

n! = n(n-1)!

4

n! = n(n-1)!

0! = 1, 1! = 1

5

n! = n(n-1)!

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

6

n! = n(n-1)!

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

fun factorial(n: Int): Double =

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

7

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

8

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

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

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

9

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

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

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

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

10

Сколько раз цифра 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

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

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

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

12

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

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

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

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

13

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

14

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

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

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

fun factorial(n: Int): Double {

var result = 1.0

for (i in 1..n) {

result *= i // result = result * i

}

return result

}

18

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

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

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

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

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

19

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

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

20

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

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

fun foo() {

var a = 3

val b = a++

}

21

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

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

fun foo() {

var a = 3

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

}

22

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

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

fun foo() {

var a = 3

val b = ++a

}

23

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

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

fun foo() {

var a = 3

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

}

24

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

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

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

25

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

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

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

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

26

// Заголовок

for (i in 1..10) {

// Тело цикла

}

27

// Заголовок

for (i in 1..10) {

// Тело цикла

}

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

28

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

29

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

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

30

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

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

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

31

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

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

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

34

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

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

35

Число 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

Число 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

Число 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

Число 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

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

40

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

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

41

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

42

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

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

43

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

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

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

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

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

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

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

46

Сколько раз цифра 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

Сколько раз цифра 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

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

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

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

49

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

◦ В виде copy-paste

50

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

◦ В виде copy-paste

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

51

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

◦ В виде copy-paste

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

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

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

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

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

52

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

◦ В виде copy-paste

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

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

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

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

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

53

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

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

54

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

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

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

55

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

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

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

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

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

56

top related