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)