Глухих Михаил Игоревич mailto:...
Post on 08-Jul-2020
11 Views
Preview:
TRANSCRIPT
Рекурсия: прямое или косвенное использование функцией самой себя
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