В настоящее время я изучаю F # самостоятельно (через сайт try f #). У меня есть следующая (imho) хвосто-рекурсивная функция для экзистенциального квантования унарного предиката (int-> bool).Рекурсия хвоста и булевы операторы
let rec exists bound predicate =
if (bound<0) then false
elif predicate(bound) then true
else exists (bound-1) predicate
Теперь эта функция также может быть записана в виде
let rec exists bound predicate = (bound+1>0) && (predicate(bound) || exists (bound-1) predicate)
Однако вторая реализация не хвостовой рекурсией. Вопрос в том, будет ли компилятор оптимизировать его для хвостового рекурсивного?
Как ситуация для еще проще (хорошо, это немного глупо) примеры, скажем
let rec hasNoRoot f =
if (f x = 0) then false
else hasNoRoot (fun x -> f (x+1))
против
let rec hasNoRoot f = (f 0 <> 0) && (hasNoRoot (fun x-> f(x+1)))
во втором примере, для того, чтобы распознать функцию (его описание на самом деле) как хвост-рекурсивный, компилятор должен только «знать», что для оценки конъюнкции не обязательно должны быть оценены оба конъюнкта.
спасибо за любые советы
возможно дубликат [? Может ли функция быть оптимизирована для хвоста рекурсии, даже когда имеется более одного различные рекурсивные вызовы] (HTTP: // StackOverflow. com/questions/15031382/can-a-function-be-optimized-for-tail-recursion-even-when-there-are-more-than-one) – joce
@Joce Хотя этот вопрос имеет некоторое сходство с вашим, он отличается чтобы гарантировать его открытость. –