Jump to content

Так (функция)

В информатике функция Tak — это рекурсивная функция , названная в честь Икуо Такеучи ( ja:竹内郁雄 ). Оно определяется следующим образом:

def tak(x, y, z):
    if y < x:
        return tak( 
            tak(x-1, y, z),
            tak(y-1, z, x),
            tak(z-1, x, y)
        )
    else:
        return z

Эта функция часто используется в качестве эталона для языков с оптимизацией рекурсии . [1] [2] [3] [4]

так() против. тарай()

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

Первоначальное определение Такеучи было следующим:

def tarai(x, y, z):
    if y < x:
        return tarai( 
            tarai(x-1, y, z),
            tarai(y-1, z, x),
            tarai(z-1, x, y)
        )
    else:
        return y  # not z!

«тараи» — сокращение от «тараи маваси» , что по-японски означает «раздавать».

Джон Маккарти назвал эту функцию tak() в честь Такеучи. [5]

Однако в некоторых более поздних источниках буква y каким-то образом превратилась в букву z. Это небольшая, но существенная разница, поскольку исходная версия значительно выигрывает от отложенных вычислений .

написан точно так же, как и другие, Хотя приведенный ниже код Haskell он работает намного быстрее.

tarai :: Int -> Int -> Int -> Int
tarai x y z
    | x <= y    = y
    | otherwise = tarai (tarai (x-1) y z)
                        (tarai (y-1) z x)
                        (tarai (z-1) x y)

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

Самый известный способ оптимизации tarai — использовать взаимно рекурсивную вспомогательную функцию следующим образом.

def laziest_tarai(x, y, zx, zy, zz):
    if not y < x:
        return y
    else:
        return laziest_tarai(
            tarai(x-1, y, z),
            tarai(y-1, z, x),
            tarai(zx, zy, zz)-1, x, y)

def tarai(x, y, z):
    if not y < x:
        return y
    else:
        return laziest_tarai(
            tarai(x-1, y, z),
            tarai(y-1, z, x),
            z-1, x, y)

Вот эффективная реализация tarai() в C:

int tarai(int x, int y, int z)
{
    while (x > y) {
        int oldx = x, oldy = y;
        x = tarai(x - 1, y, z);
        y = tarai(y - 1, z, oldx);
        if (x <= y) break;
        z = tarai(z - 1, oldx, oldy);
    }
    return y;
}

Обратите внимание на дополнительную проверку (x <= y) перед вычислением z (третьего аргумента), что позволяет избежать ненужных рекурсивных вычислений.

  1. ^ Питер Кофе (1996). «Такое испытание выдерживает испытание временем». Неделя ПК . 13 (39).
  2. ^ «Рекурсивные методы» Эллиотт Расти Гарольд
  3. ^ Джонсон-Дэвис, Дэвид (июнь 1986 г.). «Шестеро лучших на время» . Пользователь Желудя . стр. 179, 181–182 . Проверено 28 октября 2020 г.
  4. ^ Джонсон-Дэвис, Дэвид (ноябрь 1986 г.). «Тестирование Така» . Пользователь Желудя . стр. 197, 199 . Проверено 28 октября 2020 г.
  5. ^ Джон Маккарти (декабрь 1979 г.). «Интересная функция LISP». Бюллетень ACM Lisp (3): 6–8. дои : 10.1145/1411829.1411833 . S2CID   31639459 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e8a313683a8eb55e3e1ba9c13685106c__1694528580
URL1:https://arc.ask3.ru/arc/aa/e8/6c/e8a313683a8eb55e3e1ba9c13685106c.html
Заголовок, (Title) документа по адресу, URL1:
Tak (function) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)