Скидки до 20% + 2-ая профессия бесплатно и подарки на 50 000₽

Главная | Все статьи | Мотивация

Почему нумерация должна начинаться с нуля

Время чтения статьи ~3 минуты 5
Почему нумерация должна начинаться с нуля главное изображение

Это перевод заметки Эдсгера Вибе Дейкстра, повествование ведётся от лица автора оригинала.

Чтобы обозначить последовательность натуральных чисел 2, 3, …, 12 без неприятного троеточия, по соглашению можно использовать следующие четыре варианта нотации:

  1. 2 ≤ i < 13.
  2. 1 < i ≤ 12.
  3. 2 ≤ i ≤ 12.
  4. 1 < i < 13.

Есть ли предпочтительные варианты? Да. Первый и второй варианты имеют преимущество: разница между обозначенным началом и концом последовательности равна длине последовательности. Также в этих вариантах при использовании смежных последовательностей можно сказать, что конец одной последовательности будет началом второй. Пока недостаточно данных, чтобы выбрать между первым и вторым вариантом, поэтому начнём сначала.

Есть наименьшее натуральное число. Во втором и четвёртом варианте исключены нижние границы последовательности. Это приводит к тому, что для последовательностей, которые начинаются с наименьшего натурального числа, смежные последовательности уходят из области натуральных чисел. Это неудобно и некрасиво, поэтому для обозначения нижней границы предпочтительно использовать знак как в первом и третьем варианте.

Теперь рассмотрим последовательности, которые начинаются с наименьшего натурального числа. Включение верхней границы здесь превращает пустую последовательность в неестественную. Это неудобно и некрасиво, поэтому для обозначения верхней границы предпочтительно использовать знак < как в первом и четвёртом варианте. Приходим к выводу, что первый вариант предпочтительный.

Обратите внимание, язык программирования Mesa, разработанный в Xerox PARC, имеет специальную нотацию для записи интервалов чисел с помощью всех четырёх соглашений, указанных выше. Опыт использования Mesa показал, что использование второго, третьего и четвёртого варианта приводит к ошибкам. Поэтому программисты при работе с Mesa используют для обозначения последовательностей первый вариант соглашения. Эта ремарка для тех, кому важно получить результаты практических экспериментов, а не только теоретические заключения.

Когда речь идёт о последовательности с длиной N, которую мы хотим определить по нижнему индексу, следующий важный вопрос касается того, какой индекс присвоить первому элементу. Придерживаясь первого варианта нотации, получаем нижний индекс 1 ≤ i < N+1. Но если начать с нуля, получим диапазон 0 ≤ i < N, что выглядит более понятно и красиво. Так что давайте нумеровать с нуля. Порядковый номер элемента равен числу элементов, которые предшествуют ему в последовательности. Мораль истории в том, что ноль стоит считать самым натуральным числом.

Многие языки программирования разработаны без должного внимания к этой детали. В Fortran сабскрипты начинаются с 1, в Algol 60 и Pascal принят третий вариант нотации. Более новый SASL использует вариант, принятый в Fortran. Последовательность в SASL одновременно является функцией положительных чисел. Жалкий подход!

Эту заметку я написал, когда один из моих коллег-математиков, но не информатик, упрекнул более молодых специалистов по информатике в педантизме из-за их привычки нумеровать последовательности с нуля. Он сознательно назвал самое разумное соглашение провокацией. Также соглашение «End of...» рассматривается как провокационное. Тем не менее оно полезное. Я видел студента, который чуть не провалился на экзамене, так как посчитал, что вопросы заканчиваются в конце первой страницы. Думаю, Энтони Джей был прав, когда заметил следующее: «В корпоративных религиях, как и в любых других, еретиков изгоняют не потому, что они неправы, а потому, что они могут быть правыми».

Адаптированный перевод статьи Why numbering should start at zero by prof.dr. Edsger W. Dijkstra.

Аватар пользователя Дмитрий Дементий
Дмитрий Дементий 23 марта 2020
5
Похожие статьи
Рекомендуемые программы
профессия
Верстка на HTML5 и CSS3, Программирование на JavaScript в браузере, разработка клиентских приложений используя React
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Ruby, Разработка веб-приложений и сервисов используя Rails, проектирование и реализация REST API
5 месяцев
c опытом
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря