Как реализовать в ATS следующую функцию на основе хвостовой рекурсии?

У меня есть следующая рекурсивно определенная функция:

fun foo(n: int): int =
  ifcase
    | n = 0 => 0
    | n = 1 => 1
    | n = 2 => 1
    | (* else *) => foo(n-1) + foo(n-3)
  // end of [ifcase]

Как я могу реализовать foo основано только на хвостовой рекурсии.

1 ответ

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

implement bar (n) = let
  fun loop (k:int, n1:int, n2:int, n3:int): int =
    if k = n
    then n1 + n3
    else loop (k+1, n2, n3, n1+n3)
in
  ifcase
    | n = 0 => 0
    | n = 1 => 1
    | n = 2 => 1
    | _ => loop(3, 0, 1, 2)
end
Другие вопросы по тегам