2010-09-01 13 views
11

संभव डुप्लिकेट:
[F#] How to have two methods calling each other?एफ #: पारस्परिक रूप से पुनरावर्ती कार्यों

हैलो सभी,

मैं जहाँ मैं दो कार्यों कि पारस्परिक रूप से पुनरावर्ती किया जा रहा से लाभ होगा एक परिदृश्य है लेकिन मुझे सच में यकीन नहीं है कि यह कैसे करें F #

मेरा परिदृश्य एन है निम्नलिखित कोड के रूप में सरल OT, लेकिन मैं कुछ इसी तरह संकलित करने के लिए प्राप्त करना चाहते हैं: बस एक पैरामीटर के रूप में दूसरे के पारित

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

let rec g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
+0

भी देखें http://stackoverflow.com/questions/1378575/f-forward-type-declarations – Brian

+0

मैं डुप्लीकेट के रूप में यह एक चिह्नित करने के लिए संकोच, क्योंकि शीर्षक शायद बेहतर है ... – Benjol

+0

@Benjol: आम तौर पर हम खोज योग्यता में सुधार के लिए पर्याप्त रूप से अलग-अलग शीर्षकों के साथ * डुप्लीकेट * हटा नहीं देते हैं, लेकिन हम अभी भी उन्हें बंद कर देते हैं। – dmckee

उत्तर

22

आप कर सकते हैं भी letrec ... and फार्म का उपयोग करें:

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

and g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
+1

मुझे 42 सेकंड तक इसे मारो ... :-) –

+1

+1, नाइस, यह नहीं पता था कि आप बाइंडिंग के साथ 'और' का उपयोग कर सकते हैं। मैंने सोचा कि इसका उपयोग 'प्रकार' घोषणाओं तक सीमित था। – JaredPar

+0

यदि आप पारस्परिक रूप से रिकर्सिव प्रकार (जैसे दो डीयू) और दो फ़ंक्शंस हैं जो इनपुट इनपुट के रूप में प्रत्येक लेते हैं तो यह विशेष रूप से उपयोगी (आवश्यक) है। – Stringer

2

परस्पर पुनरावर्ती कार्यों प्राप्त करने के लिए

let rec f g x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

let rec g x = 
    if x>0 then 
    f g (x-1) 
    else 
    x 
2

let rec ... and ... निर्माण का उपयोग करें:

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

and g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
संबंधित मुद्दे