2015-05-07 5 views
6

में अपवाद मैं हास्केल में एक अनंत लूप समस्या में भाग गया और समझ नहीं पा रहा हूं कि कारण क्या है। मेरे पास नीचे एक ही कोड के तीन संस्करण हैं। पहला व्यक्ति अनंत लूप का कारण बनता है जबकि बाद वाले दो नहीं करते हैं। यह एक सरणी उत्पन्न करने के लिए कुछ बुनियादी संकुचित कोड है। इस मामले में इसमें केवल तीन आइटम हैं और एकमात्र रिकर्सिव कॉल तीसरी वस्तु के लिए है जो पहले दो में से बड़ा है। if a > b कथन एक लूप का कारण प्रतीत होता है (लेकिन बाद में मैं दिखाता हूं कि यह कारण नहीं हो सकता है)।अजीब <<loop>> ऐरे पीढ़ी

import Data.Array 

main :: IO() 
main = print grid 
    where grid = array (0, 2) $ map func [0 .. 2] 
     func i 
      | i == 2 = let a = grid ! (i - 1) 
          b = grid ! (i - 2) 
         in if a > b 
           then (i, a) 
           else (i, b) 
      | otherwise = (i, 0) 

निम्नलिखित संस्करण में, मैं बस if बयान के बजाय max a b का उपयोग करें। यहां कोई लूप नहीं है।

main :: IO() 
main = print grid 
    where grid = array (0, 2) $ map func [0 .. 2] 
     func i 
      | i == 2 = let a = grid ! (i - 1) 
          b = grid ! (i - 2) 
         in (i, max a b) 
      | otherwise = (i, 0) 

निम्नलिखित संस्करण में, मैं बजाय func से एक टपल लौटने का if लेकिन zip सूचकांक रहते हैं। यह भी ठीक चलाता है।

main :: IO() 
main = print grid 
    where grid = array (0, 2) $ zip [0 .. 2] $ map func [0 .. 2] 
     func i 
      | i == 2 = let a = grid ! (i - 1) 
          b = grid ! (i - 2) 
         in if a > b 
           then a 
           else b 
      | otherwise = 0 

उन दो अन्य मामलों पुनरावर्ती परिभाषा या if बयान के उपयोग के साथ कोई समस्या नहीं है कि वहाँ दिखाने के लिए लग रहे हैं।

लूप के कारण के रूप में क्या छोड़ता है? इस टपल अपनी पहली घटक में i है कि (कंप्यूटिंग या तो a या b से पहले) (i, max a b) में, हम जानते हैं:

+0

इस प्रश्न का बयान बिल्कुल सही है, समस्या का पालन करने के लिए पर्याप्त कोड, साथ ही कुछ अवलोकन जो उनके चेहरे पर पूरी तरह से विरोधाभासी हैं। इसके अलावा आप जो भी सोचते हैं उसकी एक स्पष्ट रूपरेखा समस्या और साक्ष्य हो सकती है जो नहीं थी। बस चारों ओर एक प्यारा पहेली। –

उत्तर

6

यहाँ एक दिलचस्प अवलोकन है। इसी तरह, आपके zip कोड में, हम देख सकते हैं कि टुपल्स के पहले भाग 0, 1, और 2 टुपल्स के दूसरे हिस्सों की गणना किए बिना हैं। हालांकि, if a > b then (i, a) else (i, b) में, यह स्पष्ट नहीं है कि हमारे पास पहले भाग में i के साथ एक tuple है: उदाहरण के लिए, a > b नीचे है, उदाहरण के लिए, तो इस अभिव्यक्ति का परिणाम नीचे है, पहले भाग में i के साथ एक tuple नहीं है!

यह मायने रखती है क्योंकि कंप्यूटिंग a > b कंप्यूटिंग a है, जो ज्ञान की आवश्यकता है जो मान सरणी, जो जानते हुए भी आवश्यकता है कि क्या i है मैप की सूची के अंतिम तत्व में 0 (और इसलिए पिछले 0 मान ओवरराइट चाहिए में स्थिति 0 में है की आवश्यकता है) -- एक लूप।

एक फिक्स (i, _) भाग को बाहर उठाने के लिए है, और (i, if a > b then a else b) का उपयोग करें। यह अनिवार्य रूप से आपके max समाधान करता है।

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