Какой простой код F # генерирует инструкцию .tail IL? - PullRequest
7 голосов
/ 05 июня 2010

Мне бы хотелось увидеть инструкцию .tail IL, но простые рекурсивные функции, использующие хвостовые вызовы, которые я писал, по-видимому, оптимизированы в циклы. Я на самом деле догадываюсь об этом, так как я не совсем уверен, как выглядит цикл в Reflector. Я точно не вижу никаких кодов .tail. В свойствах моего проекта отмечен флажок «Генерировать хвостовые вызовы». Я также попробовал обе сборки Debug и Release в Reflector.

Код, который я использовал, взят из Программирование F # Крисом Смитом , стр. 190:

let factorial x =
// Keep track of both x and an accumulator value (acc)
let rec tailRecursiveFactorial x acc =
    if x <= 1 then
        acc
    else
        tailRecursiveFactorial (x - 1) (acc * x)
tailRecursiveFactorial x 1

Может кто-нибудь предложить какой-нибудь простой код F #, который действительно сгенерирует .tail?

1 Ответ

6 голосов
/ 05 июня 2010

Взаимно рекурсивные функции должны:

let rec even n = 
    if n = 0 then 
        true 
    else
        odd (n-1)
and odd n =
    if n = 1 then 
        true 
    else
        even (n-1)

(еще не пробовал).

EDIT

Смотри также

Как узнать, является ли функция хвостовой рекурсивной в F #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...