2011-04-08 19 views
5

ठीक है, तो मैं जावा में प्रत्यावर्तन के आसपास मेरे सिर लपेटो करने की कोशिश कर रहा है और मैं इस तरह के योग के रूप में आसान कार्य, पीछे आदि पूरा कर सकते हैं, लेकिन मैं इस अभ्यास करने के लिए संघर्ष कर रहा है:रिकर्सन का उपयोग कर न्यूनतम सरणी ढूंढना?

मैं कोशिश कर रहा हूँ रिकर्सन का उपयोग करके सरणी में न्यूनतम संख्या पाएं लेकिन 0.0 का उत्तर प्राप्त करें।

रिकर्सन के लिए मेरी समझ यह है कि मुझे एक तत्व को बढ़ाने की आवश्यकता है और फिर एक बेस केस प्रदान करें जो रिकर्सन को समाप्त कर देगा। मुझे लगता है कि जब मैं एक मूल्य वापस करना चाहता हूं और रिकर्सन विधि को कॉल करने के लिए सबसे अच्छा है तो मैं गड़बड़ कर रहा हूं।

public static double findMin(double[] numbers, int startIndex, int endIndex) { 

double min; 
int currentIndex = startIndex++; 

if (startIndex == endIndex) 
    return numbers[startIndex]; 

else { 
    min = numbers[startIndex]; 
    if (min > numbers[currentIndex]) { 
     min = numbers[currentIndex]; 
     findMin(numbers, currentIndex, endIndex); 
    } 
      return min; 
}  
} //findMin 

उत्तर

4

सहित इस कोड में समस्याओं की एक किस्म के होते हैं:

  • आप रिकर्सिव findMin कॉल के परिणाम का उपयोग नहीं करते हैं।
  • startIndex, findMin के लिए हर कॉल के लिए एक ही होगा, क्योंकि currentIndex से पहलेstartIndex वृद्धि की जाती है startIndexके मान पर सेट किया जा रहा है।
  • यदि सरणी में इंडेक्स 1 की संख्या < = इंडेक्स 0 पर संख्या है, तो आप रिकर्सिव कॉल किए बिना भी उस नंबर को वापस कर दें।
+0

तो, अगर मैं रिकर्सिव findMin विधि को कॉल करने से पहले वापसी विवरण होना चाहिए? साथ ही, मैं समझ नहीं पा रहा हूं कि startIndex कैसे बदल रहा है। जब मैं रिकर्सिव findMin विधि को कॉल करता हूं, तो मैं वर्तमान इंडेक्स (स्टार्ट इंडेक्स के बजाए) के साथ पैरामीटर का उपयोग कर रहा हूं, जिसे बाद में एक नया स्टार्ट इंडेक्स के रूप में पास किया जाना चाहिए, सही? मुझे लगता है कि मैं खुद को भ्रमित करना शुरू कर रहा हूं :( – Vance

+0

@ user699302: समस्या 'currentIndex = startIndex ++' है। जब 'startIndex' 0 है,' currentIndex' 0 हो जाता है और 'startIndex' बन जाता है 1. जब आप' findMin' 'कहते हैं , आप इसे 'currentIndex' पास करते हैं, इसलिए उस कॉल में 'startIndex' एक बार फिर 0 हो जाएगा, जिससे अनंत रिकर्सन और स्टैक ओवरफ़्लो हो जाएगा। – ColinD

5

सुझाव::

यह वही है मैं अब तक किया है आप findMin कॉल कर रहे हैं रिकर्सिवली, लेकिन फिर अपनी वापसी मान का उपयोग नहीं।

पूरे सरणी के मिनट (1) के बीच का रिश्ता क्या है, (2) पहला तत्व, और (3) पहले तत्व से अलग सब कुछ का मिनट?

+0

तो, मैं findMin विधि रिकर्सिवली फोन और करने के लिए दिया गया मान आवंटित करने चाहिए ...? यह वह जगह है जहां मैं उलझन में हूं। क्या मैं findMin विधि को कॉल करने से पहले रिटर्न वैल्यू को परिभाषित करता हूं? – Vance

1

पहले उत्तर के अलावा कुछ टिप्पणियों:

  • int currentIndex = startIndex++; - तुम यहाँ अपना पहला तत्व याद करने जा रहे हैं। आम तौर पर, आप अपने रिकर्सिव फ़ंक्शन में इनपुट को संशोधित नहीं करना चाहते हैं। इनपुट बंद काम करते हैं और नए मूल्यों उत्पन्न जब आप समारोह में फिर से फोन करने के लिए तैयार कर रहे हैं - यानी 'findMin (संख्या currentIndex + 1, ENDINDEX)'
+0

'डबल' का डिफ़ॉल्ट मान यहां खेलने के लिए नहीं आया है, क्योंकि इसे पढ़ने से पहले 'min' हमेशा सरणी से किसी मान को असाइन किया जाता है। असल में, इसे तब तक घोषित नहीं किया जाना चाहिए जब तक कि इसे असाइन नहीं किया गया हो। – ColinD

+0

अरे, मेरी गलती, मिनट के locaiton गलत misreadon। धन्यवाद – dfb

6

यहाँ एक सरलीकृत संस्करण है:

public static double min(double[] elements, int index) { 

    if (index == elements.length - 1) { 
    return elements[index]; 
    } 

    double val = min(elements, index + 1); 

    if (elements[index] < val) 
    return elements[index]; 
    else 
    return val; 
} 
संबंधित मुद्दे