Loop
Iteration using loop
Use local variable j
1
2
3
4
5
6
def mult(i,j):
print(i,"*",j,"=",i*j)
def right(i,n):
for j in range(1,n):
mult(i,j)
right(2,10)
Iteration using function
Can function calls substitue iteraton? YES
1
2
3
4
5
6
7
def mult(i,j):
print(i,"*",j,"=",i*j)
def right(i,j,n):
if j < n:
mult(i,j)
right(i,j+1,n)
right(2,1,10)
함수를 재귀로 작성하면 좋은점..? 의미가 명확 ㅇㅅㅇ
자기 자신을 호출할때는 제일 단순한 경우부터 살펴보깅 어디서 끝나고 어디서 일을 줄여나가는지 파라미터로 하나씩 보이게 됨 복잡하게되면 나누어서 처리하고 나누어서 처리한일을 모아서 다른일 (최종결과)을 함 그런 맥락에서 보면 구조가 이해댐 ‘ㅅ’ (쀼.. 진짜?)
Nested loop
1
2
3
4
5
def mult(i,j):
print(i,"*",j,"=",i*j)
for i in range(2,5):
for j in range(1,3):
mult(i,j)
Can recursion substitue nested loop? YES
1
2
3
4
5
6
7
8
9
10
11
def mult(i,j):
print(i,"*",j,"=",i*j)
def right(i,j,n):
if j < n:
mult(i,j)
right(i,j+1,n)
def left(i,m,n):
if i < m:
right(i,1,n)
left(i+1,m,n)
left(2,5,3)
왼쪽을 i로 지정해둔 상태로 오른쪽(j)을 1로 시작, n보다 크거나 같아지면 종료하도록 반복 왼쪽은 2부터 시작해서 m보다 크거나 같아지면 종료하도록 반복
왼쪽고정 -> 오른쪽 반복 왼쪽 변화
=>
왼쪽 변화 -> 오른쪽 변화 (Nested Recursion) ?????????
outer loop : i
inner loop : j
Collection
Can we count the number of elements in a collection? YES
1
2
3
4
5
6
7
8
>>> print(len([1,2,3]))
3
>>> print(len((1,2,3)))
3
>>> print(len({1,2,3}))
3
>>> print(len("123"))
3
String is also a String
We could iterate on collection
1
2
for x in [1,2,3]:
print(x):
1 2 3
String is also a collection so we CAN iterate on it
1
2
for c in 'abc':
print(c)
a b c
String methods
List type has a method append() Sring also has methods
1
2
3
4
5
6
>>> print('hello'.upper())
HELLO
>>> print('HEllo'.upper())
HELLO
>>> print('HEllo'.lower())
hello
1
2
3
4
5
6
>>> print("Vector()")
Vector()
>>> print("Vector()".format())
Vector
>>> print("Vector({0})".format([1,2]))
Vector([1, 2])
Vector()라는 템플릿을 가지고 중괄호가 나오면 뒤에 format에서 나오는 문자/숫자를 넣는것
중괄호 안에 {0}이라는건 format의 0번째 쓰여있는것 [1,2]를 넣으라는것
Vector addition
Two 3d vectors x = (1,2,3) and y = (4,5,6) what is the addition x+y? (두개의 벡터가 같은 차원이라 더할 수 있음) x + y = (5,7,9)
can we do this?
1
2
3
4
>>> x = Vector([1,2,3])
>>> y = Vector([4,5,6])
>>> x + y
Vector([5,7,9])
YES using Vector class, we can
1
2
3
4
5
6
7
8
9
10
11
class Vector:
def __init__(self,lst):
self.vec = lst
def __repr__(self):
return "Vector({0})".format(self.vec)
def __add__(self,other):
print("add")
return Vector([self.vec[i] + other.vec[i] for i in range(len(self.vec))])
x = Vector([1,2,3])
y = Vector([4,5,6])
print(x + y)
add Vector([5, 7, 9])
repr : string을 리턴해줌; 초기화 시켰던 값(format()안에 있는 값)을 “Vector()”“안에 넣어줌 add : 더하기 연산자가 들어오면 더하기 왼편에 있는 변수의 type을 확인함 Vector라는것이 확인되면 그 클래스 안에 add가 있는지 보고 수행함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
x = ([1,2,3])
y = ([4,5,6])
x[i]+y[i] for i in range(len(x))
x와 y가 벡터라면?
x.vec = [1,2,3]
y.vec = [4,5,6]
class Vector:
def __add__(x,y):
return [x.vec[i]+y.vec[i] for i in range(len(x.vec))]
그런데 리턴값이 지금 리스트임! 벡터가 아님! 난 이 리스트를 가지고 벡터를 만들고 싶따!
--> return Vector([x.vec[i]+y.vec[i] for i in range(len(x.vec))])
class Vector:
def __init__(self,lst):
self.vec = lst
def __add__(x,y):
return Vector([x.vec[i]+y.vec[i] for i in range(len(x.vec))])
출력을 원하면
def __repr__(x):
return 'Vector({0})'.format(x.vec)
또는 이름을 줘서 return 'Vector({val})'.format(val = x.vec) 라고도 할 수 있음
Vector inner product
스칼라 만들기 Two 3d vectors x = (1,2,3) and y = (4,5,6) what is the inner product x*y? (두개의 벡터가 같은 차원이라 더할 수 있음)
How to read computer code
- Loop
- Initialize a variable
- do this with the value
- change value
-
and do this again
- Recursion
- If the input is simple, then solve the problem
- Otherwise, make the input simpler and then try to solve the problem
점점 더 작아지도록, 언젠까는 끝나버리도록.. simpler!
Collection type and methods
We could count the values in a collection using len()
We could iterate on collections including string for i in (1,2,3)이면 세번 반복 for i in “(1,2,3)” 이면 7번 반복
Each collection types have its own methods
string은 append는 없지만 +가 이씀
Function calling itself
n // m : n을 m으로 나눈 몫 (int)
Finding a valude in a sorted array
1
2
3
4
5
6
7
8
9
10
11
def search(x,A,p,q):
if p == q:
return None
else:
n = (p + q) // 2
if x == A[n]:
return n
elif x < A[n]:
return search(x,A,p,n-1)
else:
return search(x,A,n+1,q)