Хвостовая рекурсия состоит в том, чтобы иметь рекурсивную функцию, которая просто выполняет вызов для себя без каких-либо других операций.
Следующий факториал не является хвостовой рекурсией, потому что последний оператор не выполняет простой вызов факта, но требует умножения:
let rec fact n =
if n = 0 then 1
else n*(fact (n-1))
Используя аккумулятор, вы можете сделать эту функцию хвостовой рекурсивной, последний оператор выполняет вызов факта и поэтому может быть скомпилирован с использованием перехода, а не вызова:
let rec fact n r =
if n = 0 then r
else fact (n-1) (r*n)
И использование:
fact 5 1
Для добавления списков вы можете действовать одинаково, если два списка имеют одинаковую длину по крайней мере.