티스토리 뷰

The 1st element is 0th element... wait, wut?

 

시퀀스의 인덱스가 0부터 시작해야 하는 이유 (원제: Why numbering should start at zero)

 

자연수 수열 2, 3, … , 12 아래의 가지 방법으로 있다.

 

A)    2≤i<13

B)    1<i≤12

C)    2≤i≤12

D)    1<i<13

 

다른 개보다 나은 하나가 있을까? 정답: 있다. 우선 A) B) 상한과 하한의 차이가 수열의 길이와 같다. 또한, 인접한(adjacent) 수열 하나의 상한이 다른 하나의 하한이 되는 것도 있다.  하지만 이것만으로는 A) B) 어느 것이 나은지 결정할 없다.

 

자연수에는 가장 작은 수가 존재한다. B) D)처럼 하한을 수열에 포함시키지 않을 경우, 가장 작은 자연수에서 시작하는 수열은 하한이 자연수 범위를 벗어나게 된다. 이건 아름답지 않으므로, 하한에는 A) C)처럼 사용하는 것이 좋다. C)처럼 수열이 상한을 포함할 경우, 비어 있는 수열을 만들 부자연스러워진다. 이것 또한 아름답지 않으므로, 상한은 < 사용하는 것이 좋다. 이런 이유로 A) 가장 좋은 방법이 된다.

 

참고) Xerox PARC에서 만든 프로그래밍 언어 Mesa에는 위의 가지 표현이 모두 허용된다. 하지만 오랜 사용 결과, A) 제외한 표현들은 항상 부자연스러움과 실수의 원인이 되곤 했고 이유로 Mesa 프로그래머들에게도 A) 표현만 사용할 것을 강하게 권고하고 있다. 이를 경험하지 못한 일부 사람들이 나의 결론에 동의하지 않기에, 분명한 경험적 증거가 있음을 언급한다. (참고 끝)

 

길이가 N 수열의 원소에 첨자로 순서를 부여할 , 원소에 어느 숫자를 부여할지 결정하는 다소 귀찮은 작업이 필요하다. A) 택하고 1부터 시작한다면 수열의 범위는 1≤i<N+1 된다. 0부터 시작한다면 0≤i<N 된다. 그러니 0부터 시작하는 것으로 하자. 그러면 원소의 서수(ordinal) 자기보다 앞에 있는 원소의 개수가 된다. 이는 0 가장 자연수스러운자연수로 받아들여야 한다는 ( 세기에 걸친 논란에 종지부를 찍는) 교훈을 알려준다.

 

참고) 많은 프로그래밍 언어가 이런 세밀한 부분을 고려하지 않고 설계되어 있다. FORTRAN에서 인덱스는 1부터 시작한다. ALGOL60과 PASCAL은 C)의 방식이 쓰이고 있다. 가장 최근 언어인 SASL은 FORTRAN의 방식으로 되돌아갔다. 게다가 SASL에서 시퀀스는 양의 정수의 함수이다. 쯧쯧...

(후략…)

 

1982 8 11, 에츠허르 다익스트라

 

원문: http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF

번역: 게으른 맽랩/게으른 파이썬

 

 

댓글