Jump to content

Алгоритм ТПК

Алгоритм TPK — это простая программа, представленная Дональдом Кнутом и Луисом Траббом Пардо для иллюстрации эволюции языков программирования . В своей работе 1977 года «Раннее развитие языков программирования» Трабб Пардо и Кнут представили небольшую программу, которая включала массивы , индексирование, математические функции , подпрограммы , ввод-вывод , условные выражения и итерации . Затем они написали реализации алгоритма на нескольких ранних языках программирования, чтобы показать, как выражаются такие концепции.

Для объяснения названия «ТПК» авторы ссылались на закон Гримма (касающийся согласных «т», «р» и «к»), звуки в слове «типичный» и собственные инициалы (Трабб Пардо и Кнут). [1] В беседе, основанной на статье, Кнут сказал: [2]

Насколько глубока эта тема, можно оценить, только увидев, как хорошие люди с ней боролись и как идеи возникали одна за другой. Чтобы изучить это — Луис, я думаю, был главным инициатором этой идеи — мы берем одну программу — один алгоритм — и пишем ее на каждом языке. Таким образом, на основе одного примера мы можем быстро уловить особенности этого конкретного языка. Мы называем это программой ТПК, и тот факт, что на ней есть инициалы Трабба Пардо и Кнута, — это просто забавное совпадение.

Алгоритм

[ редактировать ]

Кнут описывает это следующим образом: [3]

Мы представили простую процедуру, называемую «алгоритмом TPK», и придали особенности каждого языка, выражая TPK в каждом конкретном стиле. […] Алгоритм TPK вводит одиннадцать чисел. ; затем он выводит последовательность из одиннадцати пар где

Эта простая задача, очевидно, не является большой проблемой на любом приличном компьютерном языке.

В псевдокоде:

ask for 11 numbers to be read into a sequence S
reverse sequence S
for each item in sequence S
    call a function to do an operation
    if result overflows
        alert user
    else
        print result

Алгоритм считывает одиннадцать чисел с устройства ввода, сохраняет их в массиве, а затем обрабатывает их в обратном порядке, применяя определяемую пользователем функцию к каждому значению и сообщая либо значение функции, либо сообщение о том, что значение превысил некоторый порог.

Реализации

[ редактировать ]

Реализации в оригинальной статье

[ редактировать ]

В оригинальной статье, охватывающей «примерно первое десятилетие» развития языков программирования высокого уровня (с 1945 по 1957 год), они привели следующий пример реализации «на диалекте АЛГОЛа 60 », отметив, что АЛГОЛ 60 был более позднее развитие, чем языки, обсуждаемые в статье: [1]

TPK: begin integer i; real y; real array a[0:10];
   real procedure f(t); real t; value t;
      f := sqrt(abs(t)) + 5 × t  3;
   for i := 0 step 1 until 10 do read(a[i]);
   for i := 10 step -1 until 0 do
   begin y := f(a[i]);
      if y > 400 then write(i, 'TOO LARGE')
                 else write(i, y);
   end
end TPK.

Поскольку многие из ранних языков высокого уровня не могли точно обрабатывать алгоритм TPK, они допускали следующие модификации: [1]

  • Если язык поддерживает только целочисленные переменные, предположим, что все входные и выходные данные имеют целочисленные значения и что sqrt(x) означает наибольшее целое число , не превышающее .
  • Если язык не поддерживает буквенный вывод, то вместо строки 'TOO LARGE', выведите число 999.
  • Если язык не допускает ввода и вывода, то предположим, что 11 входных значений были каким-то образом предоставлены внешним процессом, и задача состоит в том, чтобы вычислить 22 выходных значения. (999 заменяет слишком большие значения ).
  • Если язык не позволяет программистам определять свои собственные функции, то замените f(a[i]) с выражением, эквивалентным .

С этими модификациями, когда это необходимо, авторы реализуют этот алгоритм в Конрада Цузе , Plankalkül в Гольдстайна и фон Неймана , блок-схемах в Хаскела Карри предложенной нотации , в Кратком коде Джона Мочли и других, в языке промежуточных программ. Артура Беркса , в обозначениях Хайнца Рутисхаузера , на языке и компиляторе Коррадо Бема в 1951–52, в Автокоде системе Алика Гленни , в А-2 Грейс Хоппер , в системе Лэнинга и Цирлера , в самых ранних предложил Фортран (1954) Джона Бэкуса , в Autocode for Mark 1 Тони Брукера , в ПП-2 Андрея Ершова , в BACAIC Mandalay Grems и RE Porter, в Kompiler 2 А. Кентона Элсворта и других, в ADES Е.К. Блюм, внутренний переводчик Алана Перлиса , на Фортране Джона Бэкуса, в АРИФ-МАТИКЕ и МАТИКЕ-МАТИКЕ из лаборатории Грейс Хоппер , в системе Бауэра и Самельсона и (в дополнениях в 2003 и 2009 гг.) ПАКТ I и ТРАНСКОД. Затем они описывают, какая арифметика была доступна, и дают субъективную оценку этих языков по параметрам «реализация», «читабельность», «структуры управления», «структуры данных», «машинная независимость» и «влияние», помимо упоминания что каждый сделал первым. [1]

Реализации на более поздних языках

[ редактировать ]

C- реализация

[ редактировать ]

Здесь показана реализация C, эквивалентная приведенному выше АЛГОЛУ 60.

#include <math.h>
#include <stdio.h>

double f(double t)
{
    return sqrt(fabs(t)) + 5 * pow(t, 3);
}

int main(void)
{
    double a[11] = {0}, y;
    for (int i = 0; i < 11; i++)
        scanf("%lf", &a[i]);

    for (int i = 10; i >= 0; i--) {
        y = f(a[i]);
        if (y > 400)
            printf("%d TOO LARGE\n", i);
        else
            printf("%d %.16g\n", i, y);
    }
}

Python Реализация

[ редактировать ]

Это показывает реализацию Python.

from math import sqrt

def f(t):
    return sqrt(abs(t)) + 5 * t ** 3

a = [float(input()) for _ in range(11)]
for i, t in reversed(list(enumerate(a))):
    y = f(t)
    print(i, "TOO LARGE" if y > 400 else y)

Это показывает реализацию Rust.

use std::{io, iter::zip};

fn f(t: f64) -> f64 {
    t.abs().sqrt() + 5.0 * t.powi(3)
}

fn main() {
    let mut a = [0f64; 11];
    for (t, input) in zip(&mut a, io::stdin().lines()) {
        *t = input.unwrap().parse().unwrap();
    }

    a.iter().enumerate().rev().for_each(|(i, &t)| match f(t) {
        y if y > 400.0 => println!("{i} TOO LARGE"),
        y => println!("{i} {y}"),
    });
}
  1. ^ Перейти обратно: а б с д Луис Трабб Пардо и Дональд Э. Кнут, «Раннее развитие языков программирования».
    • Впервые опубликовано в августе 1976 года в машинописном черновом виде под названием Stanford CS Report STAN-CS-76-562.
    • Опубликовано в Энциклопедии компьютерных наук и технологий Джека Белзера, Альберта Г. Хольцмана и Аллена Кента (ред.), Vol. 6, стр. 419-493. Деккер, Нью-Йорк, 1977 год.
    • Перепечатано ( doi : 10.1016/B978-0-12-491650-0.50019-8 ) в «Истории вычислений в двадцатом веке» , Н. Метрополис , Дж. Хоулетт и Г.-К. Рота (ред.), Нью-Йорк, Academic Press, 1980. ISBN   0-12-491650-3
    • Перепечатано с поправками в качестве главы 1 Избранных статей по компьютерным языкам , Дональд Кнут, Стэнфорд, Калифорния, CSLI, 2003. ISBN   1-57586-382-0 )
  2. ^ «Дюжина предшественников Фортрана», лекция Дональда Кнута, 3 декабря 2003 г., в Музее истории компьютеров : Аннотация , видео
  3. ^ Дональд Кнут, TPK в INTERCAL , Глава 7 Избранных статей о развлечениях и играх , 2011 г. (стр. 41)
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9e9b1765c93e7e559b7f516a59c3c8e4__1711021020
URL1:https://arc.ask3.ru/arc/aa/9e/e4/9e9b1765c93e7e559b7f516a59c3c8e4.html
Заголовок, (Title) документа по адресу, URL1:
TPK algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)