2016-01-26 5 views
5

मैं इस साधारण जावा प्रत्यावर्तन निम्नलिखित दिशाओं भी समस्या पर काम कर रहा हूँ:जावा में रिकर्सन का उपयोग करके सुनहरा रैटियो कैसे प्राप्त करें?

  • सुनहरे अनुपात की गणना।

  • दो संख्या ए और बी को> बी> 0 के साथ दिया गया, अनुपात बी/ए है।

मैंने कुछ कोड किया है लेकिन मैं रिकर्सन ठीक से काम करने पर फंस गया हूं। यहाँ मेरी कोड है:

public class MyTesting { 

public static void main(String[] args) { 
    System.out.println(ratio(8 , 4)); 
} 

public static double ratio(int a, int b) { 

    int goldelRatio = 0; 
    if(a > b && b > 0){ 
     return goldelRatio = a/b; 
    } 

    return goldelRatio; 
} 

} 
+0

अभी शीर्षक को अपडेट किया गया है। – progx

+2

आप रिकर्सन भाग खो रहे हैं। आपको अनुपात के अंदर अनुपात को रिकर्सन करने के लिए कॉल करना होगा। – matt

+0

@ मैट हां लेकिन यह कैसे लागू होगा? मैं उस – progx

उत्तर

5

कुछ इस तरह के बारे में कैसे:

double goldenRatio(double a, double b, double epsilon) { 
    if(Math.abs((b/a) - ((a + b)/b)) < epsilon) { 
     return ((a + b)/b); 
    } else { 
     return goldenRatio(b, a + b, epsilon); 
    } 
} 

इस तरह से आप को प्राप्त क्या आप एप्सिलॉन निर्णय लेने से कैसे ठीक संकल्प होगा साथ, एक समारोह में की जरूरत है।

एक अतिरिक्त बोनस के रूप में, और हालांकि जावा में कम से कम इसे लिखने के समय (कम से कम लिखने के समय) पूंछ रिकर्सन ऑप्टिमाइज़ेशन नहीं है, सिद्धांत रूप में इस फ़ंक्शन को पूंछ रिकर्सन द्वारा अनुकूलित किया जा सकता है।

कठिन कोडित एप्सिलॉन के साथ उदाहरण:

double goldenRatio(double a, double b) { 
    double epsilon = 0.00001; 
    if(Math.abs((b/a) - ((a + b)/b)) < epsilon) { 
     return ((a + b)/b); 
    } else { 
     return goldenRatio(b, a + b); 
    } 
} 

उदाहरण चलाएँ:

public static void main(String[] args) { 
    double goldenRation1 = goldenRatio(1.0, 1.0); 
    System.out.println(goldenRation1); // prints 1.618032786885246 
    System.out.println(goldenRation1 > 1.61800 && goldenRation1 < 1.61806); // prints true 

    double goldenRation2 = goldenRatio(100.0, 6.0); 
    System.out.println(goldenRation2); // prints 1.6180367504835589 
    System.out.println(goldenRation2 > 1.61800 && goldenRation2 < 1.61806); // prints true 
} 
+0

लेकिन मैं केवल विधि के माध्यम से 2 पैरामीटर पास नहीं करना चाहता हूं 3 पैरामीटर ... – progx

+0

तो आप हार्ड कोड ईपीएसलॉन। मैं एक उदाहरण दिखाने के लिए संपादित करेंगे। आम तौर पर सभी रिकर्सन विधियों में स्टॉप हालत होनी चाहिए, या तो कड़ी मेहनत या उपयोग में उपलब्ध कराया जाना चाहिए।अन्यथा वे आगे बढ़ेंगे और आपको शायद 'स्टैक ओवरफ्लो' * विंक * – Assaf

+0

मैं आपके उत्तर का परीक्षण कर रहा हूं लेकिन जब मैं इसे अपनी टेस्ट विधि – progx

1

Recursion मुख्य रूप से तरीकों themself बुला, जिसका अर्थ है आप ऐसा ही कुछ प्रयास करना चाहिए मतलब है:

public double recursionMethod(int a, int b){ 
    int c = a+b; 
    if(Math.abs(ratio(b,a)-ratio(c,b))< (double) 1/42) 
     return ratio(c,b); 
    else 
     return recursionMethod(b,c); 
} 

1/42 सिर्फ अपने सटीकता है, तो आप किसी भी अन्य तोड़ने हालत आप की तरह लागू कर सकते हैं । तर्क के साथ मुख्य रूप से इस विधि को कॉल करें (1,1)।

+0

लेकिन मैं अनुपात और रिकर्सन विधि जैसे 2 तरीके नहीं चाहता हूं। हम उन 2 विधियों को केवल एक विधि में कैसे कार्यान्वित कर सकते हैं और फिर इसे मुख्य से कॉल कर सकते हैं? – progx

+0

फिर इस में अनुपात विधि लागू करें, क्योंकि यह उचित तर्कों के परीक्षण के साथ केवल (डबल) ए/बी देता है। (ओह, हो सकता है कि आप सोनालरेटियो को डबल करने और इस कलाकार को बदलना चाहें। अन्यथा आपको केवल 1 या 0 मिलेगा ...) – ctst

2

तुम्हारा एक पुनरावर्ती समारोह, एक पुनरावर्ती समारोह है कि स्वर्ण अनुपात नीचे एक प्रकार दिखाई देगा की गणना करता है नहीं है।

private int MAX_COUNTER = 50; 
private int count = 0; 

public double ratio(double a, double b) { 

    count++; 

    double goldenRatio = b/a; 

    if (count < MAX_COUNTER) { 
     return ratio(b, a + b); 
    } 

    return goldenRatio; 
} 

नोट: मैं काउंटर क्योंकि यह देखते हुए कि एक पुनरावर्ती समारोह अनंत दशमलव के साथ एक नंबर खोजने की कोशिश है, यह JVM StackOverflow पर :) जाना कारण होगा शब्दों में कहें, तो हम यह अभी या बाद में बंद करने के लिए मिल गया है ।

+0

मुझे नहीं लगता कि आपको स्टॉप स्थिति के रूप में पुनरावृत्तियों की संख्या का उपयोग करना चाहिए। यह देखना वास्तव में एक दशमलव संख्या है जिसे आप आमतौर पर स्टॉप कंडीशन आईएमओ के रूप में एक निश्चित परिशुद्धता तक पहुंचना चाहते हैं। – Assaf

+0

असफ़, सुनहरा अनुपात केवल दशमलव संख्या नहीं है, यह एक सीमा है, या इससे भी बेहतर, यह लगातार फाइबोनैकी संख्याओं के अनुपात की सीमा है, इसलिए आप इसे सभी दशमलव संख्या नहीं पा सकते हैं, मैं आपको इस विकिपीडिया लिंक को पढ़ने के लिए आमंत्रित करता हूं बेहतर समझने के लिए कि सुनहरा अनुपात क्या है: https://en.wikipedia.org/wiki/Golden_ratio –

+0

सही कार्यान्वयन जो भी सर्वोत्तम आवश्यकताओं के अनुरूप होगा। जैसा कि आप ओपी की टेस्ट विधि से देख सकते हैं, उसे 5 वें दशमलव स्थान पर सही होने का उत्तर चाहिए। क्या आप कह सकते हैं कि इसे प्राप्त करने के लिए कितने पुनरावृत्तियों का सामना करना होगा? पुनरावृत्तियों की संख्या का उपयोग करके आपको शायद बहुत अधिक पुनरावृत्ति करना होगा या पर्याप्त नहीं होगा। – Assaf

संबंधित मुद्दे