2010-06-05 34 views
7

Tôi muốn xem hướng dẫn .tail IL, nhưng các hàm đệ quy đơn giản sử dụng các cuộc gọi đuôi mà tôi đã viết rõ ràng được tối ưu hóa thành các vòng lặp. Tôi thực sự đoán về điều này, vì tôi không hoàn toàn chắc chắn những gì một vòng lặp trông giống như trong Reflector. Tôi chắc chắn không thấy bất kỳ mã số .tail nào. Tôi đã "Tạo cuộc gọi đuôi" kiểm tra trong tài sản của dự án của tôi. Tôi cũng đã thử cả bản dựng Debug và Release trong Reflector.Mã F # đơn giản nào tạo ra lệnh .tail IL?

Code tôi sử dụng là từ Programming F# by Chris Smith, trang 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 

bất cứ ai có thể đề xuất một số F # mã đơn giản mà thực sự sẽ tạo ra .tail?

Trả lời

6

chức năng lẫn nhau đệ quy nên:

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) 

(đã không thử nó chỉ là bây giờ).

EDIT

Xem thêm

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

+1

Tôi đã kiểm tra ngay bây giờ. Vâng! nó tạo ra đuôi. –

Các vấn đề liên quan