2010-06-05 25 views
7

.tail IL talimatını görmek istiyorum, ancak yazdığım kuyruk çağrılarını kullanan basit özyinelemeli fonksiyonlar, döngülere göre optimize edildi. Aslında bunu tahmin ediyorum, çünkü Reflektörde bir döngünün neye benzediğinden emin değilim. Yine de hiçbir .tail opcodes görmüyorum. Projemin özelliklerinde "Kuyruk aramaları oluştur" seçeneğini işaretliyorum. Reflektörde hem Debug hem de Release yapılarını denedim..tail IL talimatını oluşturan bazı basit F # kodu nedir?

kullandığım kod sayfası 190, Programming F# by Chris Smith dan:

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 

kimse gerçekten .tail üretecektir bazı basit F # kodunu önerebilirsiniz?

cevap

6

Karşılıklı özyinelemeli fonksiyonlar olmalıdır:

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) 

(şimdi sadece onu denemedim).

DÜZENLEME

Ayrıca bkz

How do I know if a function is tail recursive in F#

+1

sadece şimdi kontrol ettim. Evet! o üretir. –

İlgili konular