늘 그렇듯 프로그램을 이해하는 가장 좋은 방법은 실행해 변숫값을 추적하는 것이다. coupon collector.py
의 while
루프 끝에 루프가 반복될 때마다 변숫값을 출력하는 코드를 간단히 추가할 수 있다. [표 1.4.6]에서 F
는 False
를, T
는 True
를 나타낸다. 큰 배열을 사용하는 프로그램을 추적하는 것은 쉽지 않을 것이다. 프로그램에 길이가 n
인 배열이 있으면 변수도 n
개이므로 이 n
개의 변수를 모두 나열해야 한다. random.randrange()
를 사용하는 프로그램도 실행할 때마다 값이 달라지므로 추적하기 곤란하다. 그리고 이에 맞게 변수 간의 관계도 신중히 검사해야 한다. 이 표에서 collectedCount
는 isCollected[]
배열에서 값이 True
인 요소의 개수와 똑같아야 한다.
▼ 표 1.4.6 python3 couponcollector.py 6를 실행할 때의 트레이스
val |
isCollected[] |
collectedCount |
count |
|||||||
|
0 |
1 |
2 |
3 |
4 |
5 |
|
|||
|
|
F |
F |
F |
F |
F |
F |
|
0 |
0 |
2 |
|
F |
F |
T |
F |
F |
F |
|
1 |
1 |
0 |
|
T |
F |
T |
F |
F |
F |
|
2 |
2 |
4 |
|
T |
F |
T |
F |
T |
F |
|
3 |
3 |
0 |
|
T |
F |
T |
F |
T |
F |
|
3 |
4 |
1 |
|
T |
T |
T |
F |
T |
F |
|
4 |
5 |
2 |
|
T |
T |
T |
F |
T |
F |
|
4 |
6 |
5 |
|
T |
T |
T |
F |
T |
T |
|
5 |
7 |
0 |
|
T |
T |
T |
F |
T |
T |
|
5 |
8 |
1 |
|
T |
T |
T |
F |
T |
T |
|
5 |
9 |
3 |
|
T |
T |
T |
T |
T |
T |
|
6 |
10 |