MIT - Introduction to Computer Science and Programming in Python
함수를 만드는 가치
- 계속해서 사용할 수 있다.
이분법
아래 그림처럼 답은 낮은 경계와 위의 경계 사이 어딘가에 있다.
e.g.1)
4분의 1의 제곱근 = 2분의 1
4분의 1 < 2분의 1
e.g.2) 어떤 수의 제곱근이 어떤 수보다 큰 경우의 수정 코드
>>> def squareRootBi(x, epsilon):
... assert x>= 0, 'x must be non-negative, not' + str(x)
... assert epsilon > 0, 'epsilon must be postive, not' + str(epsilon)
... low =0
... high = max(x,1) # 수정한 코드
... guess = (low + high) / 2.0
... ctr =1
... while abs(guess**2 -x) > epsilon and ctr <= 100:
... if guess**2 < x:
... low = guess
... else:
... high = guess
... guess = (low + high)/2.0
... ctr += 1
... assert ctr <= 100, 'Iteration count exceeded'
... print ('Bi method. Num. iterations: ', ctr, 'Estimate: ', guess)
... return guess
추측값의 탄젠트 값 = 좋은 근사치
탄젠트 선은 해결책 근처의 값들의 곡선에 아주 좋은 근사치. 탄젠트의 x절편은 현재의 추측 값보다 더 정답에 가까워질 것이다. 탄젠트 선이 정말 안 맞는 곳 : 변곡점 이 때. 뉴턴의 방법 시행한다.(첫 번째 추측값은 0 으로 하지말기)
e.g.1) 뉴턴 랩슨의 NR
>>> def squareRootNR(x, epsilon):
... assert x>=0, 'x must be non-negative, not' + str(x)
... assert epsilon > 0, 'epsilon must be positive, not' + str(epsilon)
... x = float(x)
... guess = x/2.0
... guess = 0.001
... diff = guess**2 - x
... ctr = 1
... while abs(diff) > epsilon and ctr <= 100:
... guess = guess - diff/(2.0*guess)
... diff = guess**2 - x
... ctr += 1
... assert ctr <= 100, 'Iteration count exceeded'
... print('NR method. Num. iterations : ',ctr,'Estimate; ', guess
... )
... return guess
...
>>> def compareMethods():
... print(' squeareRoot(2,0.01)')
... squareRootNR(2,0.01)
... raw_input()
...
>>> compareMethods()
squeareRoot(2,0.01)
NR method. Num. iterations : 14 Estimate; 1.4142398737439434
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in compareMethods
NameError: name 'raw_input' is not defined
중요한 점 답이 틀릴 수 있다. 설명 : 두 개의 근사치가 있다.이것들이 다를 때, 어떤 것은 틀렸다라고 한다.이 부분에 대해선 학기말에 자연스레 알 수 있을 것이다.
non sclar type, 불변 : 튜플, strings
non scalr type, 변함 : 리스트
리스트는 문자열과 두 가지 면에서 다르다.
- 리스트는 변경할 수 있다.
- 값은 char타입이 될 필요가 없다.
e.g.1) 리스트의 가변성
>>> techs = ['MIT','Cal Techs']
>>> ivys = ['Havard','Yale','Brown']
>>> univs = []
>>> univs.append(techs)
>>> univs
[['MIT', 'Cal Techs']]
>>> for i in univs:
... print (i)
... for k in i:
... print (k)
...
['MIT', 'Cal Techs'] # 첫 번째 출력 값 : 리스트
MIT # 리스트 안의 요소들 출력
Cal Techs
>>> Univs = techs + ivys #flatten
>>> Univs
['MIT', 'Cal Techs', 'Havard', 'Yale', 'Brown']
>>> ivys.remove('Havard') #리스트 안의 특정 요소 제거
>>> ivys
['Yale', 'Brown']