forked from alexeygritsenko/Scala-Lections
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlec04.scala
114 lines (91 loc) · 2.76 KB
/
lec04.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Небольшая правка для прошлой лекции:
// Тип для ламбды описывается таким способом
X:() => Int
// По умолчанию
def add(x:Int, y:Int = 1) = x + y
// Примеры вызова:
add(4, 4)
add(4, 1)
add(y=2,x=3)
// Если у функции 1 аргумент, то он может быть записан
// не в круглых скобках, а в фигурных
def write(x:Int)=??? // ??? - правильное имя метода, стандартное имя функции, кидающее исключение
write(5)
write {5}
// Функции с несколькими списками параметров
def add2(x:Int)(y.Int) = x + y // Тип результата можно опустить, если он явный
add2(4)(3)
// Типы:
add:(Int, Int)=>Int
add2:Int=>(Int=>Int)
add2(4):Int=>Int
// Это называется частичным применением функции (в фп это кодируемые функции)
val inc = add2(1)
inc(3)
// Шаг 1
def twice(body:=>Unit) = {
body()
body()
}
twice(() => println("Ура!"))
// Шаг 2
def twice(body:=>Unit) = {
body
body
}
twice(println("Ура!"))
// Шаг 3
twice {
println("Ура!")
}
// Шаг 4
def repeat(n:Int)(body:=>Unit) = {
if(n > 0) {
body
repeat(n-1)(body)
}
}
repeat(4) {
// Code here
}
// Определим стандартный while
def While(cond:=>Boolean)(body:=>Unit) = {
if(cond) {
body
While(cond)(body)
}
}
// ДЗ: Сделать такое ?
repeat {
} until(условие)
// ============
// Рекурсия и хвостовые рекурсии
// Хвостовая рекурсия - рекурсия является последним действием в коде
foo(n)
{
...
foo(n-1)
// т.к. переменные не нужны (они уже не используются нигде), то можно
// их не хранить.
// т.к. параметры одинаковые, то можно использовать прежнюю память
}
// Не хвостовая
def sum(list:List[Int]): Int = {
if(list.isEmpty) 0 // так тоже никогда не пишут
else list.head + sum(list.tail)
}
// Хвостовая
@tailrec // проверка хвостовая ли рекурсия
def sum2(list:List[Int]) = {
def _sum(list:List[Int], s:Int): Int = {
if(list.isEmpty) s
else _sum(list.tail, s+list.head)
}
_sum(list, 0)
}
// Аналог params в c#
def sum(x:Int*)
x:seq[Int] // можнно так, ноо обычно foreach
sum(1)
sum(2,3,4)
// Последовательность не массив