
English: 
ANNOUNCER: Open content is
provided under a creative
commons license.
Your support will help MIT
OpenCourseWare continue to
offer high-quality educational
resources for free.
To make a donation, or view
additional materials from
hundreds of MIT courses, visit
MIT OpenCourseWare at
ocw.mit.edu .
PROFESSOR JOHN GUTTAG:
All right.
That said, let's continue, and
if you remember last time, we
ended up looking at this thing
I called square roots bi.
This was using something called
a bisection method,
which is related to something
called binary search, which
we'll see lots more of later,
to find square roots.
And the basic idea was that we
had some sort of a line, and
we knew the answer was somewhere
between this point

Korean: 
이 강의의 한국어자막은 www.snow.or.kr 자원활동가들에 의해 작성되었습니다.
이 강의의 한국어자막은 www.snow.or.kr 자원활동가들에 의해 작성되었습니다. 이 강의는 저작권법에 의해 
보호되어 있습니다.
여러분은 무료로 높은 수준의 MIT opencourseware를
수강하실 수 있습니다.
강의를 올리기 원하거나, MIT강의 중 더할 것이 있다면
ocw.mit.edu 로 
방문해주십시오.
PROFESSOR JOHN GUTTAG: All right.
좋아요. 계속해 봅시다, 지난 강의를 돌이켜 보면,
우리는 이것을 제곱근 bi 라고 부르면서 끝났습니다. 
이것은 이분법이라는 것을 사용했습니다. 
그것은 이진 검색이라는 것과 연관되어 있죠.
그것은 나중에 우리가 제곱근을 찾기 위해 좀 더 많이 살펴 볼 것 입니다.
그리고 기본적인 생각은 다음과 같습니다.
우리는 어떤 종류의 선을 가지고 있고, 우리는 답이 이 점과 이 점 사이의

Korean: 
어떤 곳 이라는 것을 압니다.
선은 완전히 정렬되어 있습니다. 
그리고 그것이 의미하는 것은, 여기 있는 어떤 것은 
그것의 오른쪽에 있는 어떤 것 보다 작다는 것 입니다. 
그래서 정수들은 완전히 정렬되어 있습니다. reals는 완전히 
정렬되어 있습니다. 많은 것들과 유리수도 
완전히 정렬되어 있습니다.
그 부분에 대해서는, 중간 부분에서 알아 보도록 하고, 우리는 그것을 테스트할겁니다. 
이것은 일종의 추측과 검사 입니다. 그리고 답이 너무 크면,
우리는 우리가 여기서 찾아야 한다는 것을 알게 됩니다. 
그것이 너무 작으면 우리는 우리가 여기서 찾아야 한다는 것을 알게 되죠.
그러면 우리는 또다시 해야하죠.
이것은 매우 비슷합니다. 이것은 우리가 전에 이야기 했던 
일종의 순환적인 생각 입니다.  거기서 우리는 우리의 문제를 가지고 그것을 더 작게 만들었고 

English: 
and this point.
The line is totally ordered.
And what that means, is that
anything here is smaller than
anything to its right.
So the integers are totally
ordered, the reals are totally
ordered, lots of
things are, the
rationals are totally ordered.
And that idea was, we make a
guess in the middle, we test
it so this is kind of a guess
and check, and if the answer
was too big, then we knew
that we should be
looking over here.
If it was too small, we knew
we should be looking over
here, and then we
would repeat.
So this is very similar, this
is a kind of recursive
thinking we talked about
earlier, where we take our
problem and we make it smaller,
we solve a smaller

English: 
problem, et cetera.
All right.
So now, we've got it, I've
got the code up for you.
I want you to notice the
specifications to start.
We're assuming that x is greater
than or equal to 0,
and epsilon is strictly greater
than 0, and we're
going to return some value y
such that y squared is within
epsilon of x.
I'd last time talked about the
two assert statements.
In some sense, strictly speaking
they shouldn't be
necessary, because the fact that
my specification starts
with an assumption, says, hey
you, who might call square
root, make sure that the things
you call me with obey
the assumption.
On the other hand, as I said,
never trust a programmer to do

Korean: 
더 작은 문제를 해결하기 등등을 했었죠
좋아요. 
그래서 지금, 우리는 그것을 알게 되었고, 저는 여러분에게 보여줄 코드가 있습니다
저는 여러분이 시작하기 위한 구체적인 사항을 주목했으면 좋겠습니다. 
우리는 x가 0 보다 훨씬 크거나 같고 
입실론은 0보다 확실히 크다고 가정할 것입니다. 그리고 우리는 
Y제곱은  입실론 x 내에 있는 어떤 y값으로 돌아갈 겁니다
저는 지난 시간에 두 가지 확실한 이야기를 했었습니다. 
어떤 의미에서, 엄격하게 말해 그것들은 필요하지 않아야 합니다. 
왜냐하면 제 구체적인 사항이 추측에서 출발한다는 사실은 
루트제곱이라고 말하는 여러분들을 
확실히 그 추측을 따르도록 하죠.
그것은 여러분에 제곱근이라고 부르는 것 일 수도 있죠.
반면에, 제가 말한 대로, 바르게 하기 위해서는

English: 
the right thing, so we're
going to check it.
And just in case the assumptions
are not true,
we're just going to stop
dead in our tracks.
All right.
Then we're going to set low to--
low and high, and we're
going to perform exactly the
process I talked about.
And along the way, I'm keeping
track of how many iterations,
at the end I'll print how many
iterations I took, before I
return the final guess.
All right, let's test it.
So one of the things I want you
to observe here, is that
instead of sitting there and
typing away a bunch of test
cases, I took the trouble to
write a function, called test
bi in this case.
All right, so what that's doing,
is it's taking the
things I would normally type,
and putting them in a
function, which I
can then call.

Korean: 
절대 프로그래머를 믿지 마세요. 왜 그러는지 그것을 확인 해보도록 할겁니다. 
그리고 가정이 옳지 않은 경우에, 
우리는 우리의 트랙에서 바로 멈출 것 입니다.
좋아요. 
그래서 우리는 낮은 값을 둘 것 입니다 – 낮은 값과 높은 값을요, 그리고 우리는 
제가 이야기 했던 프로세스를 정확하게 수행할 것 입니다. 
그리고 중간에, 저는 얼마나 많은 반복이 이루어 지는지 계속 추적하고
결국에 저는 제가 얼마나 많이 반복했는지 출력할 것 입니다
제가 최종 추측 값을 리턴하기 전에요.
좋아요.  테스트해 봅시다. 
그래서 제가 여러분에게 여기서 관찰하라고 하고 싶은 것들 중 하나는 다음과 같습니다
저기 앉아서 수 많은 테스트 예시들을 타이핑 하는 대신에
차라리 저는 함수를 쓰겠습니다. 이 경우에는 
test bi 라고 부르는 함수죠
좋습니다, 그러면 그것이 무엇을 하고, 그것이
정상적인 유형인지, 그리고 그것이 함수에 적합한지,
이런 것들이 제가 여러분에게 설명드릴 것들입니다.

English: 
Why is that better
than typing them?
Why was it worth creating
a function to do this?
Pardon?
STUDENT:: [INAUDIBLE]
PROFESSOR JOHN GUTTAG: Then I
can I can use it again and
again and again.
Exactly.
By putting it in a function, if
I find a bug and I change
my program, I can just run
the function again.
The beauty of this is, it keeps
me from getting lazy,
and not only testing my program
and the thing that
found the bug, but in all the
things that used to work.
We'll talk more about this
later, but it often happens
that when you change your
program to solve one problem,
you break it, and things that
used to work don't work.

Korean: 
왜 그것이 그것들을 타이핑 하는 것 보다 나을까요? 
왜 이것을 하기 위해 함수를 만들 가치가 있었을까요? 
뭐라고요?
[학생의 대답]
JOHN GUTTAG 교수: 그래서 저는 그것을 계속해서 
사용할 수 있습니다. 
정확해요.
그것을 함수로 둠으로써, 만약 제가 버그를 찾고 제 프로그램을 바꾼다면, 
저는 단지 함수를 다시 실행할 수 있습니다
이것의 아름다움은, 그것은 제가 게을러 지는 것을 방지 한다는 것이죠. 그리고 
제 프로그램과 버그를 찾는 것을 테스트하는 것뿐만 아니라 
작동하기 위해 사용했던 모든 것을 하죠.
우리는 이것에 대해 나중에 더 이야기 하겠지만 
여러분이 한 문제를 풀기 위해 여러분의 프로그램을 바꿀 때 종종 발생하고,
여러분은 그 문제에 부딪치고, 그리고 작동되었던 것들이 작동되지 않게 됩니다

English: 
And so what you want to do, and
again we'll come back to
this later in the term,
is something
called regression testing.
This has nothing to do with
linear regression.
And that's basically trying to
make sure our program has not
regressed, as to say,
gone backwards
in how well it works.
And so we always test
it on everything.
All right?
So I've created this function,
let's give it a shot and see
what happens.
We'll run test bi.
Whoops!
All right, well let's
look at our answers.
I first tested it on the square
root of 4, and in one
iteration it found 2.
I like that answer.
I then tested it on the square
root of 9, and as I mentioned

Korean: 
그리고 또한 학기 말쯤 다시 하겠지만, 
여러분이 할 것은 회귀 테스팅 이라는 것 입니다
이것은 선형 회귀와 아무 관련이 없습니다. 
그리고 그것은 기본적으로 우리 프로그램이 회귀하지 않았다는 것을 확실히 하려고 합니다
말한 바 대로, 그것이 어떻게 잘 작동하는지 다시 돌아 오겠습니다.
그래서 우리는 항상 모든 것에 대해서 그것을 테스트 합니다
알겠죠? 
그래서 저는 이 함수를 만들었습니다, 한 번 해보고 
무슨 일이 일어 나는지 봅시다
우리는 test bi 를 돌려 볼 것 입니다
이런,
좋아요, 자 우리의 답을 봅시다. 
저는 먼저 4의 제곱근에 대해 그것을 테스트 했습니다, 
그리고 한 번 반복해서 그것이 2 라는 것을 
알게되었습니다
저는 그 답을 좋아합니다
그리고 나서 저는 그것을 9의 제곱근에 대해 테스트 했습니다. 

Korean: 
그리고 제가 지난 시간에 언급한 대로, 
저는 3을 찾지 못했습니다
저는 무너지지 않았습니다
저는 정말 실망하지 않았습니다, 
그것이 3과 충분히 가까운 것을 찾았다는 것만으로도
저는 행복 합니다
좋아요. 
저는 2에 대해서도 해 보았습니다. 
저는 그것에 대해 확실하게 정확하고 정밀한 답을 기대하지는 않았습니다. 
그러나 저는 어떤 것을 얻었습니다, 그리고 제가 이것을 제곱하면, 여러분은 
2와 매우 가까운 답을 
찾을 수 있습니다.
그리고 나서 저는 0.25 에 대해 시도해 보았습니다. 
4분의 1 이죠. 하지만 일어난 일은 제가 원하던 것이 아니었습니다. 
여러분이 볼 바 대로, 그것은 충돌 했습니다.
그것은 정말로 고장 나지는 않았습니다. 그것은 한 가지 확실한 한가지를 찾았습니다.
그래서 여러분이 함수의 아래를 보면, 여러분은 그것을 알 수 있습니다, 

English: 
last time, I didn't find 3.
I was not crushed.
You know, I was not really
disappointed, it found
something close enough
to 3 that I'm happy.
All right.
I tried it on 2, I surely didn't
expect a precise and
exact answer to that, but I
got something, and if you
square this, you'll find
the answer kept pretty
darn close to 2.
I then tried it on
0.25 One quarter.
And what happened was
not what I wanted.
As you'll see, it crashed.
It didn't really crash, it found
an assert statement.
So if you look at the bottom
of the function, you'll see

Korean: 
사실, 저는 그것을 검사했습니다. 
저는 카운터가 0 보다 작거나 같다고 확신합니다. 
프로그램을 끝내지 않는 것을 확인해 봐야겠어요. 왜냐하면
아직 답을 찾지 못했기 때문이죠.
자, 그것은 제 프로그램이 영원히 도는 것 보다 낫다는 점에서는 좋지만, 
그것은 0.25의 제곱근을 얻을 수 없기 때문에 
나쁜 점도 있습니다.
여기서 무엇이 잘못 되었죠? 
여기서 무엇이 잘못 되었죠? 
여러분은 – 누군가는 그들이 답을 주고 싶어서 
안달인 것처럼 보입니다
아니면 머리만 긁적이고 있나요? 
좋아요.
기억하세요, 저는 우리가 이분법을 할 때,
우리는 답이 낮은 경계와 위의 경계 사이 
어딘가에 있다고 말했었습니다
자, 4 분의 1 의 제곱근은 무엇이죠? 

English: 
that, in fact, I checked
for that.
I assert the counter is less
than or equal to 0.
I'm checking that I didn't leave
my program because I
didn't find an answer.
Well, this is a good thing, it's
better than my program
running forever, but it's a bad
thing because I don't have
it the square root of 0.25.
What went wrong here?
Well, let's think about
it for a second.
You look like-- someone
looks like they're
dying to give an answer.
No, you just scratching
your head?
All right.
Remember, I said when we do
a bisection method, we're
assuming the answer lies
somewhere between the lower
bound and the upper bound.
Well, what is the square
root of a quarter?

Korean: 
그것은 2 분의 1 입니다.
자, 어디서 제가 답을 찾는 
제 프로그램을 말했었죠?
0과 x 사이 입니다. 
그래서 문제는, 답이 저기 어딘 가에 있다는 것 입니다, 그리고 
저는 절대로 이 부분을 완전히 검사를 해서 
그것을 찾지는 않을 거예요, 알겠죠? 
그래서 기본적인 생각은 좋습니다, 그러나 저는 답이 
낮은 경계와 위의 경계 사이에 있어야 한다는 초기 조건을 만족하는데 
실패했습니다. 
그렇죠?
그리고 왜 제가 그것을 했죠? 
왜냐하면 제가 여러분이 조각들을 볼 때 무슨 일이 일어 나는지 잊어 버렸기 때문 입니다
그래서 제가 무엇을 해야 하나요? 
사실 그런데, 제가 답이 저기에 있다고 말한것은 
거짓말이었어요.

English: 
It is a half.
Well, what-- where did
I tell my program
to look for an answer?
Between 0 and x.
So the problem was, the answer
was over here somewhere, and
so I'm never going to find it
cleverly searching in this
region, right?
So the basic idea was fine, but
I failed to satisfy the
initial condition that the
answer had to be between the
lower bound and the
upper bound.
Right?
And why did I do that?
Because I forgot what happens
when you look at fractions.
So what should I do?
Actually I lied, by the way,
when I said the answer was
over there.

Korean: 
답은 어디있을까요?
누구 아는사람?
그것은 바로 여기에 있죠.
왜냐하면 4 분의 1 의 제곱근은 4 분의 1 보다 작지 않기 때문에, 
그것은 4 분의 1 보다 큽니다. 
이해가 되나요?
알겠죠? 2 분의 1은 분명히 4 분의 1 보다 큽니다
그러니 그것은 그 부분에 있는 것이 아닙니다
Fix는 무엇입니까? 
Fix는 꽤 간단해야 합니다. 사실 우리는 
여기 fly에서 그것을 할 수 있어야만 합니다. 
무엇을 바꿔야 하죠?  
낮은 경계를 바꿔야만 하나요? 
제곱근이 0보다 작아질 수 있습니까? 
그럴 필요는 없습니다. 그래서, 여기 높은 경계쯤에서 
무엇을 해야 합니까? 
오, 컨닝 좀 해서 높은 경계의 반을 괜찮게 만들어 볼 수는 있습니다. 하지만 
아주 정직한 것은 아니겠죠

English: 
Where was the answer?
Somebody?
It was over here.
Because the square root of a
quarter is not smaller than a
quarter, it's bigger
than a quarter.
Right?
A half is strictly greater
than a quarter.
So it wasn't on the region.
So how-- what's the fix?
Should be a pretty simple fix,
in fact we should be able to
do it on the fly, here.
What should I change?
Do I need to change
the lower bound?
Is the square root ever going
to be less than 0?
Doesn't need to be, so, what
should I do about the upper
bound here?
Oh, I could cheat and make, OK,
the upper bound a half,
but that wouldn't
be very honest.

Korean: 
여기서 행하기에 좋은 것은 무엇이 될까요? 
뭐라구요? 
루트 x를 해 볼 수는 있지만, 아마도 그냥  
단순한 것을 해야 할 것 같군요. 
가령, 아이구. 
가령 x의 최대값과 1로 만들어 보겠습니다. 
그리고  나서, 만약 1보다 작은 어떤 루트 값을 찾고 있다면 
그것이 제 지역에 있는 것을 알겠죠, 맞습니까?

English: 
What would be a good
thing to do here?
Pardon?
I could square x, but maybe
I should just do something
pretty simple here.
Suppose-- whoops.
Suppose I make it the
max of x and 1.
Then if I'm looking for the
square root of something less
than 1, I know it will be
in my region, right?
All right, let's save
this, and run it

English: 
and see what happens.
Sure enough, it worked and, did
we get-- we got the right
answer, 0.5 All right?
And by the way, I checked
all of my previous ones,
and they work too.
All right.
Any questions about
bisection search?
One of the things I want you to
notice here is the number
iterations is certainly
not constant.
Yeah, when I will looked at 4,
it was a nice number like 1, 9
looked like it took me 18, 2
took me 14, if we try some big

Korean: 
좋아요, 이것을 저장해 봅시다. 그리고 실행해보고 어떤 일이 일어나는지 봅시다. 
당연하게 실행되죠. 그리고 우리는 
옳은 답 0.5를 얻었습니다. 맞나요? 
또 전의 값들을 모두 체크 해 봤더니, 
그것들도 역시 실행이되네요.
좋습니다. 
이분법 검색에 대해 질문 있습니까?
여기서 제가 여러분들에게 알려주고 싶었던 것들 중 한가지는 
반복법은 분명히 고정된 것은 아니라는 것입니다. 
네, 제가 4를 볼 때는 
1과 같은 좋은 숫자였고 
9는 18을 가져오는 것같이 보이고
2는 14를 가져다 줍니다. 만약 우리가 어떤 더 큰 숫자로 해본다면 

Korean: 
아마 더 길게 가져오겠죠. 
이런 숫자들은 작지만 때때로 우리가
정말로 어려운 문제에 닥쳤을 때 우리 스스로 
반복법을 고려해 보게 만들 것이며
수렴 속도라고 불리는 어떤 것을 고려하게 할 것입니다.
이분법은 고대 그리스 시절부터 알려져왔습니다. 그리고 
많은 사람들이 믿었죠 심지어 바빌론인들 까지도 말입니다. 
그리고 저번 시간에 제가 언급했던 것처럼, 
17세기까지는 그것은 최신식이었습니다. 
어느 시점부터 더 좋아졌구요. 
자 한번 생각해봅시다. 그리고 우리가 이것을 풀 때 
실제로 우리가 하는 것이 무엇인지 한번 생각해 봅시다.

English: 
numbers it might take
even longer.
These numbers are small, but
sometimes when we look at
really harder problems, we got
ourselves in a position where
we do care about the number of
iterations, and we care about
something called the speed
of convergence.
Bisection methods were known to
the ancient Greeks, and it
is believed by many, even
to the Babylonians.
And as I mentioned last time,
this was the state of the art
until the 17th century.
At which point, things
got better.
So, let's think about it, and
let's think about what we're
actually doing when
we solve this.
When we look for something like
the square root of x,

Korean: 
루트 x제곱 같은 어떤 값을 찾고 있을 때, 
실제로 우리가 하는 일은 방정식을 푸는 일입니다. 
F 방정식의 추측 값은  마이너스 루트 x의 추측 값과 
같음을 볼 수 있습니다. 
좋습니다.  그것이 바로 같은 것이죠. 그리고 우리는 
F의 값이 0과 같은 이 방정식을 풀어 볼 것입니다. 
이 방정식의 루트 값을 찾아봅시다
그래서 만약 우리가 그림을 이용하여 이것을 볼 때, 우리가 

English: 
what we're really doing,
is solving an equation.
We're looking at the equation
f of guess equals the guess
squared minus x.
Right, that's what that is equal
to, and we're trying to
solve the equation that
f of guess equals 0.
Looking for the root
of this equation.
So if we looked at it
pictorially, what we've got

English: 
here is, we're looking at f of
x, I've plotted it here, and
we're asking where it
crosses the x axis.
Sorry for the overloading
of the word x.
And I'm looking here at 16.
Square root of 16, and my plot
basically shows it crosses at
4 and-- well, I think
that's minus 4.
The perspective is tricky--
and so we're
trying to find the roots.
Now Isaac Newton and/or Joseph
Raphson figured out how to do
this kind of thing for all
differentiable functions.
Don't worry about
what that means.
The basic idea is, you take a
guess, and you -- whoops --
and you find the tangent
of that guess.
So let's say I guessed 3.

Korean: 
여기서 얻는 것은 x의 f를 보면, 여기서 이것을 구성해 봤고
그것이 x축을 지나는 점에서 물어보게 됩니다
X라는 단어를 너무 많이 썼네요
그리고 16, 여기를 봅니다. 
루트 16의 제곱근, 그리고 제 시나리오는 전반적으로 
이것이 4를 지나는 것을 보여줍니다. 
그리고 음, 마이너스 4인 것 같네요. 
관점이 좀 헷갈리네요
이제 아이삭 뉴턴과 조셉 랩슨은 모든 미분 함수에 가능한 
이런 종류의 것을 어떻게 할 수 있는지 알아냈습니다
그것이 무엇을 의미하는지에 대해서 걱정하지 마세요.
기본적인 생각은 , 추측해보세요. 아이구 
 이미 그것의 추측 값의 탄젠트 값을 찾으셨네요
자, 제가 3으로 추측했다고 
말해 봅시다

English: 
I look for the tangent
of the curve at 3.
All right, so I've got the
tangent, and then my next
guess is going to be where the
tangent crosses the x axis.
So instead of dividing it in
half, I'm using a different
method to find the next guess.
The utility of this relies upon
the observation that,
most of the time-- and I want to
emphasize this, most of the
time, that implies not all of
the time-- the tangent line is
a good approximation
to the curve for
values near the solution.
And therefore, the x intercept
of the tangent will be closer

Korean: 
저는 3의 곡선에서 탄젠트 값을 
찾고 있습니다
좋습니다. 탄젠트 값을 얻었습니다. 그리고 다음 제 추측은 
x축을 지나는 탄젠트 값입니다. 
그것을 반으로 나누는 대신 저는 
다음 추측 값을 얻을 수 있는 다른 방법을 쓰겠습니다
이것의 유용성은 관찰에 따라 다르죠, 대부분
시간에 따라 다르지만요. - 저는 이것을 강조하고 싶은데, 대부분의 시간은 
모든 시간을 의미하는 것은 아닙니다- 탄젠트 라인은 
해결책 근처의 값들의 곡선에 
아주 좋은 근사치입니다. 
그래서, 탄젠트의 x절편은 현재의 추측 값보다 

Korean: 
더 정답에 가까워질 것입니다. 
그런데 이것은 항상 맞을 까요? 
맞지 않는 곳, 탄젠트 라인이 정말 안 좋은 곳이 있다면 
저에게 보여주세요.
네,
바로 아래 이 부분을 골랐다고 가정해 보면, 0이겠죠. 
음 거기의 탄젠트 값은 심지어 x절편을 갖지도 않네요. 
물 속에 들어가 정말 죽고 싶군요 
이것은 수와 관련된 프로그래밍을 하는 사람들이 
항상 걱정하는 것들의 종류입니다
그리고 그들이 그것에 대처하는 방법에 약간의 속임수를 쓰는 것이 많죠
그들은 살짝 그것을 동요시키겠죠. 
이 시점에 여러분은 그런 것들을 고민해선 안됩니다.
충분히 흥미롭게도, 이런 방법은 실제로  
대부분의 손 계산기에서 사용되던 방법입니다. 
그래서 만약 여러분이 루트 제곱근 버튼이 있는 계산기가 있다면, 
그 계산기 안에서는 실제로 뉴턴의 방법으로 실행되는 것입니다. 
이제 루트 제곱근 값을 구하는데 여러분이 고등학교 때 배웠던 것과 같이 

English: 
to the right answer than
the current guess.
Is that always true,
by the way?
Show me a place where that's
not true, where the tangent
line will be really bad.
Yeah.
Suppose I choose it right
down there, I guess 0.
Well, the tangent there will not
even have an x intercept.
So I'm really going to
be dead in the water.
This is the sort of thing that
people who do numerical
programming worry about
all the time.
And there are a lot of a little
tricks they use to deal
with that, they'll perturb
it a little
bit, things like that.
You should not, at
this point, be
worrying about those things.
This method, interestingly
enough, is actually the method
used in most hand calculators.
So if you've got a calculator
that has a square root button,
it's actually in the calculator
running Newton's method.
Now I know you thought it was
going to do that thing you

Korean: 
할 거라고 생각하는 것을 제가 압니다. 
이 부분은 제가 꽤 이해하기가 어려웠던 부분인데, 그렇게 하는 것이 아니라, 
뉴턴의 방법을 사용해서 합니다.
그럼 우리는 어떻게 x절편과 탄젠트의 절편을 
찾을 수 있습니까? 
음, 파생 물이 들어오는 곳입니다. 
우리가 아는 것은 추측 값의 지점에서 
첫 번째 f 함수의 파생 물에 의하여 
탄젠트의 기울기가 주어졌다는 것입니다. 
그래서, 추측 값의 기울기는 첫 번째 파생 물입니다
좋습니다
y/x를 미분한 값이죠
Y의 변화 량을 x의 변화 량으로 나눈 것입니다
우리는 대수학을 좀 사용할 수 있습니다. 이 부분을 지나가고 싶지 않았는데, 
우리가 찾게 될 것은 그것의 루트 제곱근, 

English: 
learned in high school for
finding square roots, which I
never could quite understand,
but no.
It uses Newton's method
to do it.
So how do we find the intercept
of the tangent, the
x intercept?
Well this is where derivatives
come in.
What we know is that the slope
of the tangent is given by the
first derivative of the
function f at the
point of the guess.
So the slope of the guess
is the first derivative.
Right.
Which dy over dx.
Change in y divided
by change in x.
So we can use some algebra,
which I won't go through here,
and what we would find is that
for square root, the

English: 
derivative, written f prime of
the i'th guess is equal to two
times the i'th guess.
Well, should have left myself
a little more room, sorry
about that.
All right?
You could work this out.
Right?
The derivative of the
square root is not
a complicated thing.
Therefore, and here's the key
thing we need to keep in mind,
we'll know that we can choose
guess i plus 1 to be equal to
the old guess, guess i, minus
whatever the value is of the

Korean: 
파생 물 이고, i'th 추측 값의 f’은 i'th 추측 값의 
두 배와 같다고 할 수 있습니다
음, 잠깐 좀 더 찾아봐야 할 것 같은 데 
미안합니다
됐습니까? 
여러분은 이제 이것을 할 수 있습니다. 
맞죠? 
루트의 제곱근의 파생 물은 
복잡한 것이 아닙니다. 
그렇기 때문에, 우리가 명심해야 될 중요한 것은 바로 
우리가 i의 추측 값과 1을 더한 것은 i의 추측 값과 같고, 
예전 관념은, i를 추측하고 새로운 값이 어떤 것이 됬든지

Korean: 
거기서 1을 빼는 것이었었죠. 그것을
예전 것에서 2배로 나누어야하죠.
좋습니다. 이것은 여기에 도달하기 위해서 간단하지 않은 
대수학의 계산법의 종류입니다. 
예를 들어봅시다. 
가령 3의 추측 값으로 루트 16의 제곱근을 찾는 것부터 
시작한다고 가정해 봅시다
시작한다고 가정해 봅시다
3의 f 함수의 값은 
무엇입니까? 
음, 거기서 우리의 함수를 보면, 
제곱근의 추측 값, 
3 곱하기 3은 
3 곱하기 3은 
9가 되고, 제 생각엔 마이너스 16가 이 경우 

English: 
new guess-- of the old rather,
the old guess-- divided by
twice the old guess.
All right, again this is
straightforward kind of
algebraic manipulations
to get here.
So let's look at an example.
Suppose we start looking for
the square root of 16
with the guess 3.
What's the value of the
function f of 3?
Well, it's going to be, we
looked at our function there,
guess squared, 3 times 3 is 9 I
think, minus 16, that's what

English: 
x is in this case, which
equals minus 7.
That being the case, what's
my next guess?
Well I start with my old guess,
3, minus f of my old
guess, which is minus 7, divided
by twice my old guess,
which is 6, minus the minus,
and I get as my new guess
4.1666 or thereabouts.
So you can see I've missed,
but I am closer.

Korean: 
x 값이 되고 그것은 마이너스 7과 같은 값이 될 것입니다.
제 다음 추측 값은 무엇입니까? 
음 예전 추측 값, 3으로 시작해보면 예전 추측 값의 마이너스 f(마이너스 7이 되는)를 
예전 추측 값의 두 배로 나누면 6이네요. 
마이너스의 마이너스니깐. 그리고 제 새로운 추측 값으로 4.1666 
또는 그 정도를 얻습니다. 
여러분은 제가 놓친 것을 볼 수 있지만, 그래도 저는 가까운 값을 가졌습니다

Korean: 
그리고 전 i의 추측 값과 값이 사용하여 이런 과정을 볼 수 있고
다시 해봅시다
직관적으로 이것을 생각하는 한가지 방법은, 만약 파생 물은 
아주 크다면 함수는 빠르게 변화될 것입니다. 그러므로
우리는 아주 작은 단계를 밟아 나가야 합니다
좋습니다. 
만약 파생 물이 작다면, 바꾸지 않습니다
아마도 더 큰 단계를 나아가고 싶겠지만, 그것에 대해 
걱정하지 맙시다. 알겠죠?
이 방법이 항상 통하나요? 
음, 우리 이미 아니라는 것을 보았죠. 만약 제 초기 추측 값이 0이라면, 
어디에도 갈 수 없습니다. 
사실, 제 프로그램은 망쳤습니다. 왜냐하면 아주 안 좋은 0으로 
나누는 것으로 끝내려고 했기 때문이죠
힌트는 만약 우리가 뉴턴의 방법을 시행했다면 항상, 
첫 번째 추측 값은 0으로 하지 마십시오

English: 
And then I would reiterate this
process using that as
guess i, and do it again.
One way to think about this
intuitively, if the derivative
is very large, the function
is changing quickly, and
therefore we want to
take small steps.
All right.
If the derivative is small, it's
not changing, maybe want
to take a larger step,
but let's not worry
about that, all right?
Does this method work
all the time?
Well, we already saw no, if my
initial guess is zero, I don't
get anywhere.
In fact, my program crashes
because I end up trying to
divide by zero, a really
bad thing.
Hint: if you implement Newton's
method, do not make
your first guess zero.

English: 
All right, so let's look
at the code for that.
All right so-- yeah, how do I
get to the code for that?
That's interesting.
All right.
So we have that square
root NR.
NR for Newton Raphson.
First thing I want you to
observe is its specification
is identical to the
specification
of square root bi.
What that's telling me is that
if you're a user of this, you
don't care how it's
implemented, you

Korean: 
좋습니다, 거기의 코드를 보도록 합시다. 
그 부분을 위한 코드를 어떻게 얻을 수 있습니까? 
참 흥미롭네요
좋습니다. 
이제 우리는 루트 NR의 제곱근을 갖습니다. 
뉴턴 랩슨의 NR입니다. 
여러분이 관찰하기를 원하는 첫 번째의 것은 
그것의 사양은 루트 bi의 제곱근의 사양과 같다는 것입니다. 
그것이 제게 말해주는 것은 만약 여러분이 이것의 사용자라면, 
그것이 어떻게 시행되는지 신경 쓰지 않아도 되고, 

English: 
care what it does.
And therefore, it's fine that
the specifications are
identical, in fact it's a good
thing, so that means if
someday Professor Grimson
invents something that's
better than Newton Raphson, we
can all re-implement our
square root functions and none
of the programs that use it
will have to change,
as long as the
specification is the same.
All right, so, not much
to see about this.
As I said, the specifications is
the same, same assertions,
and the-- it's basically the
same program as the one we
were just looking at, but I'm
starting with a different
guess, in this case x over 2,
well I'm going to, couple of
different guesses we can start
with, we can experiment with
different guesses and see
whether we get the same
answer, and in fact, if we did,
we would see we didn't

Korean: 
그것이 어떤 일을 하는지 신경 써야 합니다. 
그러므로, 그 사양은 동일하고 사실 
좋은 것입니다. 그것이 의미하는 것은, 
만약 누군가, grimson 교수가 뉴턴 랩슨의 것 보다 나은 것을 발명한다면, 
우리는 우리의 루트 제곱근 모두를 다시 시행할 수 있고, 
어떤 프로그램도 변할 필요가 없다는 뜻입니다. 
사양이 같은 한 말이죠.  
좋아요, 여기에서는 볼 것이 많지 않아요. 
내가 말했듯이, 같은 사양입니다. 같은 말을 하고 있죠. 
그리고 – 기본적으로 겉으로 보기에 같은 프로그램 이예요 
하지만, 다른 추측으로 시작해 볼 겁니다. 
x의 경우에는
두어가지 다른 추측으로 시작해볼 수 있겠죠, 
다른 추측들로 실험 해 보고
같은 답이 얻어지는지 아닌지 볼 수 있습니다. 

English: 
get this, we got different
answers, but correct answers.
Actually now, we'll just
comment that out.
I'm going to compute the
difference, just as I did on
the board, and off we'll go.
All right.
Now, let's try and compare
these things.
And what we're going to look at
is another procedure, you
have the code for these things
on your handout so we won't
worry, don't need to show you
the code, but let's look at
how we're going to test it.
I'm doing a little trick by the
way, I'm using raw input
in my function here, as a just
a way to stop the display.
This way I can torture
you between tests
by asking you questions.
Making it stop.
All right, so, we'll
try some things.

Korean: 
그리고 사실, 우리가 그것을 확인해 본다면, 같은 답이 아니라 
다른 답을 얻을 겁니다. 
하지만 그게 맞는 답이죠. 사실 지금, 우리는 그 오류를 밝히는 겁니다. 
이제 그 차이점을 산출해 봅시다. 
칠판에 써있는 대로, 해봅시다. 
좋아요 , 
이제, 한 번 해보고 비교해 봅시다. 
그리고 다른 절차를 보게 될 텐데, 
프린트물에 이 절차에 필요한 코드를 가지고 있으니 걱정 마세요
코드를 보여줄 필요는 없지만 우리가 어떻게 테스트 할 지 
한 번 살펴봅시다
약간의 요령이 있어요, 그것은 바로
화면을 멈추게 하기 위해서 함수에 원래 그대로의 입력값을 사용하는 거죠. 
이 방법은 테스트  사이에서 계속 질문을 하기 때문에
여러분들을 귀찮게 할 수도 있어요. 
그러면 멈추세요. 
좋아요, 그러면, 뭔가 해봅시다. 

English: 
We'll see what it does.
Starting with that, well, let's
look at some of the
things it will do.
Yeah, I'll save it..
It's a little bit annoying, but
it makes the font bigger.
All right, so we've tested it,
and we haven't tested it yet,
we have tested it but, we
haven't seen it, well, you
know what I'm going to do?
I'm going to tort--
I'm going to make the font
smaller so we can see more.
Sorry about this.

Korean: 
시작해 보면 그게 무엇인지 알 수 있어요. 
자, 어떻게 될지 한 번 해봅시다,
자, 어떻게 될지 한 번 해봅시다,
네, 저장을 했구요
살짝 귀찮지만, 폰트를 더 크게 만들어주죠.
좋습니다, 그러면 이것은 테스트를 마쳤고 이건 아직 테스트를 안 했습니다, 
테스트를 했지만 결과를 보지 못했죠, 
자, 이제 내가 무엇을 할 지 알겠어요? 
되는대로 —폰트를 더 작게 해서 더 많이 
볼 수 있게 할 거예요. 
아 이건 좀 유감이군요. 

Korean: 
뒤쪽 학생들은 편하게 앞으로 와도 좋아요.
좋아요, 
결과적으로 우린 이것을 얻었고, 
이제 한 번 테스트 해 봅시다. 그러면 여기서 이것을  해 볼 텐데요, 
방법들을 비교해 가면서 실행해 볼 겁니다. 
자, 우리는 이 유명한 컴퓨터가 정말 쓸모 없다는 것을 보게 될 거예요.
좋아요 
그러면 2번을 한 번 해봅시다, 
그리고 2번을 좀 더 자세히 보면, 
이분법은 8개의 표기법을 가지고 있고, 
Newton Raphson 은 3개의 표기법을 가집니다, 그러니까 조금 더 효율적이죠. 
그것들은 살짝 다른 답이 나오지만 
두 가지 답 모두 여기 입실론 값으로 준 0.1안에 있습니다
모두 이해됐죠? 

English: 
Those of you in the back, feel
free to move forward.
All right.
So we've got it, now
let's test it.
So we're going to do
here, we're going
to run compare methods.
Well we're seeing this famous
computers are no damn good.
All right.
So we're going to try it on 2,
and at least we'll notice for
2, that the bisection method
took eight iterations, the
Newton Raphson only took three,
so it was more efficient.
They came up with slightly
different answers, but both
answers are within .01 which
is what I gave it here for
epsilon, so we're OK.

English: 
So even though they have
different answers, they both
satisfy the same specification,
so we have no problem.
All right?
Try it again, just for fun.
I gave it here a different
epsilon, and you'll note, we
get different answers.
Again, that's OK.
Notice here, when I asked for
a more precise answer,
bisection took a lot more
iterations, but Newton Raphson
took only one extra iteration to
get that extra precision in
the answer.
So we're sort of getting the
notion that Newton Raphson
maybe is considerably better on
harder problems. Which, by

Korean: 
혹시 그것들이 다른 답이 나오더라도, 
그것들은 같은 사양을 만족합니다, 그러면 문제없겠죠?  
좋아요.
다시 한 번 해봅시다, 그냥 재미로 해보세요. 
여기에 다른 입실론 값을 주었고 다른 답이 얻어지는 것에 
여러분은 주목할겁니다. 
괜찮아요, 여기에 주목하세요, 
여기에 주목해 보세요, 조금 더 정확한 답을 물었을 때 
이진법은 더 많은 표기법을 가지지만 Newton Raphson은 
더 정확한 답을 얻기 위해 하나의 표기법만 가지죠. 
그래서 우리는 Newton Rapson방법이 
아마도 더 어려운 문제에 더 낫지 않을까 생각합니다. 

Korean: 
아 그런데, 이것은,
훨씬 더 어려운 문제를 만들어 볼 거예요. 
훨씬 더 작은 입실론값을 주면서 말이죠, 그리고 다시, 여러분은, 
Newton Raphson 이 하나씩 서서히 올라오는 것을 보게 될 거예요. 이 방법이 오래 걸리지는 않지만 
이분법이 점점 더 악화될 때 더 좋은 답을 얻었죠. 
그러니까 여러분이 보는 것처럼, 우리는 문제의 어려움을 확대시키면서 
좋은방법과 안좋은 방법의 차이점은
점점 더 커집니다
중요한 점이죠 그리고 이 수업과정의 
한 부분에서 우리는 컴퓨터의 복잡도에 대해 이야기 해 볼 건데요, 
여러분들은 우리가 정말 주의 해야 할 것들은 얼마나
효율적인 프로그램이 쉬운 문제들이 아니라 
얼마나 효율적인가가 어려운 문제라는 것을 알게 될 겁니다
좋아요, 

English: 
the way, it is.
We'll make it an even harder
problem, by making it looking
an even smaller epsilon, and
again, what you'll see is,
Newton Raphson just crept up by
one, didn't take it long,
and got the better answer,
where bisection
gets worse and worse.
So as you can see, as we
escalate the problem
difficulty, the difference
between the good method and
the not quite as good
method gets bigger
and bigger and bigger.
That's an important observation,
and as we get to
the part of the course, we
talk about computational
complexity, you'll see that what
we really care about is
not how efficient the program
is on easy problems, but how
efficient it is on hard
problems. All right.

English: 
Look at another example.
All right, here I gave it
a big number, 123456789.
And again, I don't want to
bore you, but you can see
what's going on here
with this trend.
So here's an interesting
question.
You may notice that it's always
printing out the same
number of digits.
Why should this be?
If you look at it here,
what's going on?
Something very peculiar
is happening here.

Korean: 
다른 예제를 한 번 봅시다
좋습니다, 여기 큰 숫자가 있네요, 123456789
그리고 다시, 나는 여러분들을 지루하게 하고 싶지는 않지만 
여러분들은 여기서 이러한 경향은 어떻게 되는지 볼 수 있죠
여기 흥미로운 질문이 하나 있네요. 
여러분들은 항상 같은 디지털 숫자가 출력된다는 것에 
주목할 것입니다. 
왜 그렇죠? 
만약 여기서 이것을 본다면, 어떻게 될까요? 
어떤 매우 독특한 일이 여기서 일어나고 있네요. 

English: 
We're looking at it, and we're
getting some funny answers.
This gets back to what I talked
about before, about
some of the precision of
floating point numbers.
And the thing I'm trying to
drive home to you here is
perhaps the most important
lesson we'll
talk about all semester.
Which is, answers
can be wrong.
People tend to think, because
the computer says it's so, it
must be so.
That the computer is--
speaks for God.

Korean: 
우리가 볼 거예요. 그리고 우리는 재미있는 답을 얻을 겁니다.
부동 소수점 수의 정확성에 대해서 전에 내가 뭐라고 했었는지 
생각해 보세요. 
여기에서 내가 여러분에게 납득시키려고 하는 것은 아마도 
이번 학기 수업 중에서 가장 
중요한 것이 될 거예요. 
답이 틀릴 수도 있어요.
사람들이 생각하는 경향이 있어요. 컴퓨터가 그렇게 말하고 있죠. 
분명히 그렇습니다. 
컴퓨터는 말은 신처럼 잘합니다. 

Korean: 
그러니까 그것은 결코 틀리지 않아요. 
아마도 그것은 교황처럼 말하죠. 
절대 어떤 것도 실수하지 않아요
하지만 사실, 틀렸어요. 
내 스스로 계속적으로 반복하면서 되풀이 하면서 찾은 것 중 하나는
졸업한 내 제자는, 컴퓨터로부터 답을 얻었을 때, 
항상 스스로에게 물어보죠
내가 왜 이것을 믿는가? 
이 답이 정말 옳은 것인가? 하구요
왜냐하면 어쩔 수 없는 것이 아니기 때문이죠. 
그러니까 만일 우리가 여기에서 얻은 답을 본다면, 
어떤 이상한 답입니다. 맞죠? 
이 컴퓨터가 지금 우리에게 프린팅 해 주는 것이 
무엇이 이상한가요? 
왜 우리가 스크린에서 보이는 것을 
의심해야 할까요?
학생의 대답.
JOHN GUTTAG교수 : 자, 그것은 다를 뿐 아니라, 

English: 
And therefore it's infallible.
Maybe it speaks for the Pope.
It speaks for something
that's infallible.
But in fact, it is not.
And so, something I find myself
repeating over and over
again to myself, to my graduate
students, is, when
you get an answer from the
computer, always ask yourself,
why do I believe it?
Do I think it's the
right answer?
Because it isn't necessarily.
So if we look at what we've got
here, we've got something
rather peculiar, right?
What's peculiar about what
this computer is now
printing for us?
Why should I be really
suspicious about what I see in
the screen here?
STUDENT: [INAUDIBLE]
PROFESSOR JOHN GUTTAG: Well, not
only is it different, it's

Korean: 
정말 완전히 달라요. 맞죠? 
만약, 조금 달랐다면, 내가 말할게요, 좋아요
나는 다른 근사치를 가지고 있어요. 
하지만 이것들이 다를 때, 어떤 것이 틀렸다는 거예요. 
맞습니까?
우리는, 숫자적인 것을에 대해 조금 더 상세하게 알게 될 이번 학기 말 즈음에 
무엇이 잘못된 것인지 알 수 있을 겁니다. 
여러분들은 오버플로, 언더플로
부동 소수점에 대한 문제들을 볼 수 있을 거예요. 
그리고 그것들이 전부 들어있는 것을 보면, 
그것은 의심해 보기 좋은 특별한 것이죠. 
어쨌든 여기서 내가 알려주고 싶은 것은, 피해망상은 
건강한 인간의 특성이라는 겁니다.
좋아요, 
우리는 더 잘 실행되는 다른 것들을 볼 수 있습니다. 
그리고 우리는 지금 이동할게요. 
좋아요.
우리는 우리가 가지고 있는 제곱근을 해결하는 방법을 보았고, 

English: 
really different, right?
If it were just a little bit
different, I could say, all
right, I have a different
approximation.
But when it's this different,
something is wrong.
Right?
We'll, later in the term when
we get to more detailed
numerical things, look
at what's wrong.
You can run into issues of
things like overflow,
underflow, with floating point
numbers, and when you see a
whole bunches of ones, it's
particularly a good time to be
suspicious.
Anyway the only point I'm making
here is, paranoia is a
healthy human trait.
All right.
We can look at some other things
which will work better.
And we'll now move on.
OK.
So we've looked at how to
solve square root we've,
looked at two problems, I've
tried to instill in you this

English: 
sense of paranoia which is so
valuable, and now we're going
to pull back and return to
something much simpler than
numbers, and that's Python.
All right?
Numbers are hard.
That's why we teach whole
semesters worth of courses in
number theory.
Python it's easy, which is why
we do it in about four weeks.
All right.
I want to return to some
non-scalar types.
So we've been looking, the last
couple of lectures, at
floating point numbers
and integers.
We've looked so far really
at two non-scalar types.

Korean: 
두 가지 문제를 보았어요. 나는 여러분에게 
매우 가치 있는 피해망상의 감각을 심어주려고 했어요. 
그리고 지금 우리는 돌아가서 숫자보다 훨씬 더 간단한 것들을 볼 겁니다. 
그것은 바로 파이톤이죠. 
어때요? 
숫자는 어렵죠. 
그게 바로 내가 학기 전체라는 시간을 들여 여러분에게 
숫자 이론을 가르치고 있는 이유죠. 
파이톤은 쉬워요, 우리는 4주에 걸쳐 그것을 알아볼 겁니다.
좋아요, 
논 스칼라 타입에 돌아가봅시다. 
우리는 지는 두 번의 수업에서 부동 소수점과 
정수를 봤었어요
우리는 지금까지 두 가지의 논스칼라 타입을 봤죠. 

Korean: 
그리고 이것들은 괄호와 문자열이 쓰여져 있는 튜플들입니다
이 두 가지의 열쇠는 이것들은 
변하지 않는다는 거예요. 
나는 튜플은 변하지 않는다고 꽤 정확하게 말한 누군가에게 
이 문제에 대한 이메일에 답장을 했었는데
내가 어떻게 바꿀 수 있을까요? 
나의 답은, 여러분은 바꿀 수 없다는 것입니다. 하지만, 여러분은 
조금 다르지만 오래된 것과 매우 유사한 
새로운 하나를 만들어낼 수는 있어요
자 이제 우리는 어떤 변하지 않는 타입에 대해여 이야기 해 볼 것 입니다. 
여러분이 변경 할 수 있는 것들이 있습니다. 
그리고 우리는 여러분 중 다수가 이미 마주친, 
아마도 우연히 마주쳤겠지요, 그것을 가지고 시작해 보려고 합니다, 그것은 리스트 입니다. 
리스트는 문자열과 두 가지 면에서 다릅니다. 하나는 리스트는 변경할 수 있습니다, 

English: 
And those were tuples written
with parentheses, and strings.
The key thing about
both of them is
that they were immutable.
And I responded to at least one
email about this issue,
someone quite correctly said
tuple are immutable, how can I
change one?
My answer is, you can't change
one, but you can create a new
one that is almost like the
old one but different in a
little bit.
Well now we're going to talk
about some mutable types.
Things you can change.
And we're going to start with
one that you, many of you,
have already bumped
into, perhaps by
accident, which are lists.
Lists differ from strings in two
ways; one way is that it's

Korean: 
다른 하나는 값은 캐릭터 타입이 되어야 할 
필요가 없습니다. 
그것들은 숫자가 될 수도 있고, 캐릭터 타입이 될 수도 있고, 
스트링 타입이 될 수도 있습니다, 그것들은 심지어 다른 리스트가 될 수 도 있습니다.
그래서 여기 몇 가지 예들을 봅시다. 
우리가 하려고 하는 것은, 우리는 즉시 두 가지에서 일 할 것 입니다. 
그래서 저는 다음과 같은 문장을 쓸 것 입니다, techs, 변수는, 
리스트와 같다, 그리고 그냥 괄호가 아니라 사각 괄호로 썼습니다, 
 MIT, Cal Tech, 괄호를 닫습니다. 

English: 
mutable, the other way is that
the values need not be
characters.
They can be numbers, they can
be characters, they can be
strings, they can even
be other lists.
So let's look at some
examples here.
What we'll do, is we'll work
on two boards at once.
So I could write a statement
like, techs, a variable, is
equal to the list, written with
the square brace, not a
parenthesis, MIT, Cal
Tech, closed brace.

Korean: 
그것이 기본적으로 하는 것은, 그것은 변수 techs 를 가집니다, 
그리고 그것은 이제 그것이 그것에 두 아이템을 가진 리스트를 가리키도록 합니다. 
하나는 스트링 MIT 이고 하나는 스트링 Cal Tech 입니다.
자 살펴 봅시다. 
그리고 우리는 이제 또 다른 작은 테스트 프로그램을 돌려 볼 것 입니다
리스트를 보여 주세요, 그리고 출력했구요, 그리고 MIT목록, Cal Tech 를 출력 합니다
이제 제가 새로운 변수를 소개할 것 이라고 가정해 보세요, 우리는 그것을 ivys 라고 할 것 입니다, 

English: 
What that basically does, is it
takes the variable techs,
and it now makes it point to a
list with two items in it.
One is the string MIT and one
is the string Cal Tech.
So let's look at it.
And we'll now run another little
test program, show
lists, and I printed it,
and it prints the
list MIT, Cal Tech.
Now suppose I introduce a new
variable, we'll call it ivys,

Korean: 
그리고 우리는 그것이 리스트 Harvard, Yale, Brown 과 같다고 말합니다
아이비 리그 대학들 중 세 가지 입니다. 
그것이 하는 것은, 저는 새 변수 ivys 를 만듭니다, 그리고 그것은 
이제 또 다른 것을 가리킵니다, 우리는 그 객체를 호출 합니다, 
파이썬 그리고 자바 에서, 그리고 많은 다른 언어에서, 
메모리 어딘가에 있는 이것들을 객체로써 생각해 보세요
그리고 저는 그것 전부를 쓰지 않을 것 입니다, 저는 단지 그것이 
그것 안에 하나로써 하버드를 가지고, 그리고 그것은 예일을 가지고, 그리고
그것은 브라운을 가진다고 쓸 것 입니다. 
그리고 저는 이제 ivys 를 출력할 수 있습니다.
그리고 그것은 우리가 그것이 출력할 것 이라고 예상했던 것을 출력 하기에 확실히 충분 합니다

English: 
and we say that is equal to the
list Harvard, Yale, Brown.
Three of the ivy league
colleges.
What that does is, I have a new
variable, ivys, and it's
now pointing to another, what we
call object, in Python and
Java, and many other languages,
think of these
things that are sitting
there in memory
somewhere as objects.
And I won't write it all out,
I'll just write it's got
Harvard as one in it, and
then it's got Yale, and
then it's got Brown.
And I can now print ivys.
And it sure enough prints what
we expected it to print.

English: 
Now, let's say I have univs, for
universities, equals the
empty list. That would create
something over here called
univs, another variable, and it
will point to the list, an
object that contains
nothing in it.
This is not the same as none.
It's it does have a value, it
just happens to be the list
that has nothing in it.
And the next thing I'm
going to write is
univs dot append tex.
What is this going to do?

Korean: 
이제, 제가 univs 를 가진다고 말해 봅시다, 그것은 대학들을 가르키죠
빈 리스트와 같습니다. 
그것은 여기서 univs 라는 또 다른 변수를 생성 합니다, 
그리고 그것은 리스트를 가리킬 것 입니다, 리스트는
그 안에 아무 것도 없는 객체 입니다.
이것은 아무 것도 없는 것과 같지 않습니다. 
그것은 값을 가집니다, 그것은 그 안에 아무 것도 없는 
리스트 가 되는 것 입니다.
그리고 제가 쓰려고 하는 다음 것은 univs.append tex 입니다. 
이것으로 무엇을 하죠? 

English: 
It's going to take this list and
add to it something else.
Let's look at the code.
I'm going to print it, and
let's see what it prints.
It's kind of interesting.
Whoops.
Why did it do that?
That's not what I expected.
It's going to print that.
The reason it printed that is
I accidentally had my finger
on the control key, which said
print the last thing you had.
Why does it start with square
braced square brace?
I take it-- yes, go ahead.

Korean: 
이 리스트를 가지고 그것에  다른 어떤 것을 더할 것 입니다.
코드를 살펴 봅시다. 
저는 그것을 출력할 것 입니다, 어떻게 출력되는지 한 번 봅시다
흥미로울거예요. 
웁스. 
왜 이렇게 되었죠? 
제가 예상 했던 것이 아닙니다. 
예상했던 것이 출력될거예요
제 손가락을 실수로 컨트롤 키에 두어서 
이렇게 출력됐군요, 컨트롤 키를 누르는 것은 여러분이 가진 마지막 것을 출력 하라고 말하거든요
왜 그것이 사각 괄호로 시작 하나요? 
일단 가지고 – 네, 계속해 보세요.

Korean: 
학생 : 그래서 교수님은 리스트에 리스트를 더하고 있으신가요?
존 구탁 교수 : 그래서 저는 리스트에 리스트를 더할 것 입니다. 
제가 가지고 있는 것은 – 제가 빈 리스트에 덧붙인 것은 
요소 MIT 와 Cal Tech 이 아니라 
포함하고 있는 리스트 입니다.
그래서 저는 이 전체의 객체에 덧붙입니다
그 객체가 리스트 그 자신이기 때문에
제가 얻는 것은 리스트의 리스트 입니다.
이제 여기 붙인 이 표기법이 파이톤법이라 불리는 것임을 
알려드리죠. 
이제 우리는 우리가 클래스와 상속에 대해 할 때 방법에 대해 

English: 
STUDENT: So you're adding
a list to a list?
PROFESSOR JOHN GUTTAG: So I'm
adding a list to a list. What
have I-- what I've appended to
the empty list is not the
elements MIT and Cal Tech
but the list that
contains those elements.
So I've appended this
whole object.
Since that object is itself
a list, what I get
is a list of lists.
Now I should mention this
notation here append is what
is in Python called a method.
Now we'll hear lots more about
methods when we get to classes

Korean: 
더 많이 들을 수 있습니다. 그러나 정말로, 메소드는 다른 문법을 가진 함수에 대해 
복잡한 단어 입니다
이것을 두 인자를 가지는 함수로 생각해 보세요, 
그것의 첫 번째는 univs 입니다, 그리고 그것의 두 번째는 techs 입니다. 
그리고 이것은 그 함수 호출을 쓰는 
단지 다른 문법 입니다.
이번 학기 말쯤, 우리는 왜 우리가 이 문법을 사용해야 하는지 
그리고 그것이 왜 완전히 파이톤 설계자에 의한 
임의의 말도안되는 결정이 아닌지 알게 될 것 입니다. 
그리고 파이톤 전에 많은 언어들도 그렇습니다, 사실 그것이 임의적인 것이 아니라 매우 합리적인 것 이죠. 
그러나 지금은, 이것을 단지 함수 호출을 쓰는 
또 하나의 다른 방법으로 생각 하세요. 

English: 
and inheritance, but really, a
method is just a fancy word
for a function with
different syntax.
Think of this as a function that
takes two arguments, the
first of which is univs and the
second of which is techs.
And this is just a different
syntax for writing that
function call.
Later in the term, we'll see
why we have this syntax and
why it wasn't just a totally
arbitrary brain-dead decision
by the designers of Python,
and many languages before
Python, but in fact is a
pretty sensible thing.
But for now, think of this as
just another way to write a
function call.

Korean: 
좋아요, 지금까지 잘 이해 했나요?
이제 우리가 할 다음 것으로써 우리가 원하는 것은 
우리가 ivys 에 univ 를 붙일 것 이라고 말해 봅시다. 
그것에 또 다른 리스트를 붙입시다. 
좋아요. 
그래서 우리는 그것을 할 것 입니다, 그리고 이제 우리는 MIT, Cal Tech 을 얻습니다, 
그 리스트에 이어 Harvard, Yale, Brown 리스트가 있습니다. 
그래서 이제 우리는 두 리스트를 포함하는 리스트를 가집니다.
우리가 다음에 하려고 하는 것은 무엇 입니까? 
자 우리가 할 것 이지 무언인지 살펴 봅시다 .
여기 이 코드를 보세요. 

English: 
All right, people
with me so far?
Now let's say we wanted as the
next thing we'll do, is we're
going to append the ivys
to univ. Stick
another list on it.
All right.
So we'll do that, and now we get
MIT, Cal Tech, followed by
that list followed by the list
Harvard, Yale, Brown.
So now we have a list containing
two lists.
What are we going to try next?
Well just to see what we know
what we're doing, let's look
at this code here.
I've written a little for
loop, which is going to

English: 
iterate over all of the elements
in the list. So
remember, before we wrote things
like for i in range 10,
which iterated over a list or
tuple of numbers, here you can
iterate over any list, and so
we're going to just going to
take the list called univs
and iterate over it.
So the first thing we'll do is,
we'll print the element,
in this case it will
be a list, right?
Because it's a list with
two lists in it.
Then the next thing in the loop,
we're going to enter a
nested loop, and say for every
college in the list e, we're
going to print the name
of the college.
So now if we look what we get--
do you not want to try

Korean: 
저는 작은 for 루프를 썼습니다, 그것은 리스트에 있는 
모든 요소들을 반복할 것 입니다
그러므로 기억하세요, 우리가 10 범위 내의 for i 같은 것을 쓰기 전에
그것은 리스트 또는 숫자의 튜플을 반복 했습니다, 여기서 여러분은 
어떤 리스트든 반복 할 수 있습니다, 그래서 우리는 
univs 라는 리스트를 가지고 그것을 반복할 것 입니다.
그래서 우리가 할 첫 번째 것은, 우리는 요소를 출력할 것 입니다, 
이 경우에 그것은 리스트일 것 입니다, 그렇죠? 
그것이 그 안에 두 리스트를 가진 리스트 이기 때문 입니다. 
그리고 루프에서 다음 것은, 우리는 내포된 리스트로 들어 갈 것 입니다. 
그리고 리스트 e 의 모든 대학에게 말할 것 입니다, 
우리는 대학의 이름을 출력할 것 입니다. 
그래서 이제 만약 우리가 가지고 있는 것을 보면 – 여러분은 그것을 실행 하려고 

Korean: 
해보고 싶지 않습니까? – 그것은 첫 번째로 
MIT 와 Cal Tech 을 포함한 리스트를 출력할 것 입니다, 
그리고 나서 개별적인 문자열 MIT 와 Cal Tech 이 있고요, 
그리고 나서 Harvard, Yale, and Brown 을 포함하는 문자열, 그리고 Harvard, Yale, and Brown 문자열을 출력 합니다.
그래서 우리가 이것을 보려고 하는 것은 매우 강력한 개념 입니다
이 리스트들, 그리고 우리가 그것들로 
많은 흥미로운 것들을 할 수 있습니다. 
제가 이 구조를 모두 원하지 않는다고 가정해 보세요, 그리고 저는 
붙인 리스트라는 것을 하길 원합니다
자 저는 그것을, 메소드 append 을 사용하는 대신에,

English: 
and execute that?-- it'll
first print the list
containing MIT and Cal Tech,
and then separately the
strings MIT and Cal Tech, and
then the list containing
Harvard, Yale, and Brown, and
then the strings Harvard,
Yale, and Brown.
So we're beginning to see this
is a pretty powerful notion,
these lists, and that
we can do a lot of
interesting things with them.
Suppose I don't want all of this
structure, and I want to
do what's called flattening the
list. Well I can do that
by, instead of using the
method append, use the

English: 
concatenation operator.
So I can concatenate techs
plus ivys and assign that
result to univs, and then when
I print it you'll notice I
just get a list of
five strings.
So plus and append do very
different things.
Append sticks the list on the
end of the list, append
flattens it, one level
of course.
If I had lists of lists of
lists, then it would only take
out the first level of it.
OK, very quiet here.
Any questions about
any of this?
All right.
Because we're about to get
to the hard part Sigh.
All right.
Let's look at the-- well,
suppose I want to, quite

Korean: 
연속 연산자를 사용함으로써 그것을 할 수 있습니다. 
그래서 저는 techs plus ivys 를 연결 시킬 수 있습니다 그리고 그 결과를 
univs 에 할당 합니다, 그리고 나서 제가 그것을 프린트 할 때 여러분은 
제가 다섯 개 스트링의 리스트를 얻는 다는 것을 볼 수 있을 것 입니다.
그래서 plus 와 append 는 매우 다른 것을 합니다. 
Append 는 리스트를 리스트의 끝에 붙입니다, 
append 는 그것에 붙입니다, 수업의 한 단계에요. 
 만약 제가 리스트의 리스트를 가지고 있다면, 그러면 그것은 
그것의 첫 번째 단계를 꺼낼 것 입니다. 
네, 여기 매우 조용 하네요. 
이것에 대해 어떤 질문 있습니까? 
좋아요. 
왜냐하면 우리는 어려운 파트 Sigh 로 막 넘어 가려고 하기 때문 입니다. 
좋아요.
자 봅시다 – 자, 제가, 꽤 당연하게도, 

Korean: 
하버드를 제거 하길 원한다고 가정해 보세요
좋아요, 저는 그리고 나서 여기 아래서 갖습니다, 
거기서 저는 그것을 제거 할 것 입니다. 
그래서 이것은 다시 또 다른 방법 입니다, 이것은 제거하고 
두 인자를 갖습니다, 첫 번째 인자는 ivys 이고, 
두 번째 인자는 문자열 Harvard 입니다. 
그것이 Harvard 를 찾는 첫 번째 순간 까지 목록을 통해서 찾아봐야겠어요. 
그리고 나서 그것을 꺼내 봅시다. 
그래서 여기서 무슨 일이 일어 났나요? 
제가 잘 못된 장소로 들어 왔나요?
학생 : 교수님은 두 리턴 값에 이릅니다.
존 구탁 교수 : 제가 두 리턴 값에 이르렀군요. 
뭐라고요?
학생 : 교수님은 두 리턴 값에 이릅니다. 
하나는..
존 구탁 교수 : 이것 인가요
학생 : 아닙니다, 위에 있는 것 입니다.
존 구탁 교수 : 위에 있는 것을 말하는군요.  
학생 : 네, 맞습니다.
존 구탁 교수 : 그런데 왜 하버드가 거기 있죠?

English: 
understandably, eliminate
Harvard.
All right, I then get
down here, where I'm
going to remove it.
So this is again another method,
this is remove, takes
two arguments, the first
is ivys, the second
is the string Harvard.
It's going to search through the
list until the first time
it finds Harvard and then it's
going to yank it away.
So what happened here?
Did I jump to the wrong place?
STUDENT: You hit two returns.
PROFESSOR JOHN GUTTAG:
I hit two returns.
Pardon?
STUDENT: You hit two returns.
One was at
STUDENT: Pardo
PROFESSOR JOHN GUTTAG:
This one.
STUDENT: No, up one.
PROFESSOR JOHN GUTTAG: Up one.
STUDENT: Right.
PROFESSOR JOHN GUTTAG: But
why is Harvard there?

English: 
STUDENT: I'm sorry, I didn't
write it down.
PROFESSOR JOHN GUTTAG: Let's
look at it again.
All right, it's time to
interrupt the world, and we'll
just type into the shell.
Let's see what we get here.
All right, so let's just see
what we got, we'll print
univs. Nope, not defined.
All right, well let's do a list
equals, and we'll put
some interesting things in it,
we'll put a number in it,
because we can put a number,
we'll put MIT in it, because
we can put strings, we'll put
another number in it, 3.3,
because we can put floating
points, we can put all sorts
of things in this list. We can
put a list in the list again,
as we've seen before.
So let's put the list containing
the string a, and
I'll print out, so now we see
something pretty interesting

Korean: 
학생 : 죄송합니다, 저는 그것을 적지 않았습니다.
존 구탁 교수 : 그것을 다시 살펴 봅시다. 
좋아요, 그것은 세계를 방해 할 시간 입니다, 그리고 우리는 
단지 쉘에 타이프 할 것 입니다
우리가 여기서 무엇을 가지는지 봅시다. 
좋아요, 그래서 단지 우리가 무엇을 가지는지 살펴 봅시다, 우리는 univs 를 출력 할 것 입니다. 
아니에요, 정의되지 않았습니다.
좋아요, 자 리스트 동일하게 해 봅시다, 그리고 여러분은 
그 안에 어떤 흥미로운 것들을 집어 넣을 수 있습니다, 
우리는 그 안에 숫자를 넣을 수 있으니까 숫자를 넣어보죠, 
그 안에 스트링도 넣을 수 있으니까 MIT 를 집어 넣을 것 입니다, 
그 안에 부동 소숫점도 가능하니까 다른 숫자 3.3 를 집어 넣어 봅시다. 
우리는 이 리스트 안에 모든 종류의 것을 집어 넣을 수 있습니다. 
우리는 리스트에 다시 리스트를 넣을 수도 있습니다, 우리가 전에 본 것 처럼요. 
그래서 문자열 a 를 포함하는 리스트를 넣습니다, 그리고 
저는 출력할 것 입니다, 그래서 이제 우리는 리스트에 대해 정말 재미 있는 것을 볼 것 입니다,

English: 
about a list, that we can mix up
all sorts of things in it,
and that's OK.
You'll notice I have the string
with the number 1, a
string with MIT, and then it
just a plain old number, not a
string, again it didn't quite
give me 3.3 for reasons we've
talked before, and now
it in the list a.
So, suppose I want to
remove something.
What should we try and remove
from this list?
Anybody want to vote?
Pardon?
All right, someone wants
to remove MIT.
Sad but true.
Now what do we get
if we print l?
MIT is gone.
How do I talk about the
different pieces of l?

Korean: 
그리고 여러분은 그 안에서 모든 것을 섞을 수 있습니다
그리고 그것은 문제없습니다.
여러분은 제가 숫자 1 스트링, MIT 스트링을 가지고 있는 것을 알아 차릴 것 입니다, 
그리고 나서 그것은 단지 평범한 오래 된 수 입니다, 스트링이 아니라요
다시 그것은 저에게 3.3 을 주지 않습니다 우리가 전에 말했던 이유 때문 입니다
그리고 이제 그것은 리스트 a 안에 있습니다.
그래서 제가 어떤 것을 제거 하길 원한다고 가정해 보세요. 
이 목록에서 어떤 것을 해 보아야 하고 어떤 것을 제거해야 하죠? 
누가 말해 볼 학생 있나요? 
뭐라고요? 
좋아요, 어던 학생이 MIT 를 제거 하길 원합니다. 
슬프지만 맞습니다. 
이제 우리가 l 을 출력 한다면 우리는 무엇을 얻습니까? 
MIT 는 사라졌습니다.
제가 l 의 다른 부분에 대해 어떻게 말할 수 있나요? 

English: 
Well I can do this. l sub 0--
whoops-- will give me the
first element of the list,
just as we could do with
strings, and I can look at l
sub minus 1 to get the last
element of the list, so I can
do all the strings, all the
things that I could
do with strings.
It's extremely powerful,
but what we
haven't seen yet is mutation.
Well, we have seen
mutation, right?
Because notice that what remove
did, it was it actually
changed the list. Didn't create
a new list. The old l
is still there, but it's
different than it used to be.
So this is very different from
what we did with slicing,
where we got a new copy
of something.
Here we took the old one
and we just changed it.

Korean: 
자 저는 이것을 할 수 있습니다. l 서브 0 – 웁스 – 그것은 저에게 리스트의 첫 번째 인자를 줄 것 입니다, 
우리가 문자열로 할 수 있는 것처럼요, 그리고 저는 
l 서브 마이너스 1 이 리스트의 마지막 인자를 얻는 것을 볼 수 있습니다, 
그래서 저는 제가 스트링으로 할 수 있는 모든 것들, 
모든 문자열들을 할 수 있습니다
그것은 정말 효과적이죠, 그렇지만 아직 우린 . 
변화를 보지 못했어요
자, 우리는 이제 변화를 보았습니다, 그렇죠? 
제거된 것을 보세요, 그것은 정말로 
리스트를 변화 시켰습니다. 
새로운 리스트를 만들지는 않았습니다. 
오래 된 l 은 여전히 거기 있습니다, 그러나 그것은 
그것이 있었던 것 과는 다릅니다. 
그래서 이것은 우리가 편뜨기로 했던 것과는 매우 다릅니다, 
거기서 우리는 무엇의 새로운 복사를 했습니다. 
여기서 우리는 오래 된 것을 가지고 우리는 그것을 단지 변화 시켰습니다.

Korean: 
목요일에, 우리는 그것이 여러분이 변화 없이 할 수 있는 것보다 
여러분을 많은 것을 더 편리하게 하도록 하는 이유를 볼 것 입니다.

English: 
On Thursday, we'll look at why
that allows you to do lots of
things more conveniently than
you can do without mutation.
