2013-08-14 9 views
9

मुझे यह त्रुटि यह कह रही है कि मैं एक चर और नरक का उपयोग नहीं कर रहा हूं; लेकिन मेरी नोब आंखों के लिए, ऐसा लगता है कि मैं हूं:सीखना जाना - "घोषित और उपयोग नहीं किया गया" त्रुटि

func Sqrt(x float64) float64 { 

    z := float64(x); 

    for i := 0; i < 10; i++ { 
     z := z - (z*z - x)/(2 * z); 
    } 

    return z; 
} 

क्या कोई यह बता सकता है कि मुझे भाषा के बारे में क्या याद आ रहा है? मुझे लगता है कि इसे = बनाम := और स्कॉइंग के साथ करना है, लेकिन मुझे यकीन नहीं है।

उत्तर

12

:= आपके फॉर-लूप में एक नया चर z घोषित करता है जो बाहरी z को छाया करता है। समस्या को ठीक करने के लिए इसे एक सादे = में बदलें।

func Sqrt(x float64) float64 { 

    z := x 

    for i := 0; i < 10; i++ { 
     z = z - (z*z - x)/(2 * z); 
    } 

    return z; 
} 

वैसे, बराबर परिशुद्धता और थोड़ा अधिक गति आप निम्नलिखित कार्यान्वयन जो एक बार में अपने कदम के दो करता है की कोशिश कर सकते के लिए:

func Sqrt(x float64) float64 { 
    z := x 
    for i := 0; i < 5; i++ { 
     a := z + x/z 
     z = a/4 + x/a 
    } 
    return z 
} 
+0

सामान्य रूप से '=' और ': =' के बीच क्या अंतर है? – dubeegee

+4

'=' किसी मौजूदा चर के लिए मान निर्दिष्ट करता है, जबकि ': =' एक नया चर घोषित करता है और इसे मान देता है। यदि आप सी (या दोस्तों) को जानते हैं तो यह 'foo = 42' बनाम' int foo = 42' –

+2

@dubeegee a = b का अर्थ है "बी का मान दें"। ए: = बी का अर्थ है "एक वैरिएबल घोषित करें जिसमें बी का प्रकार और मान है"। – fuz

4

यहाँ एक और तरीका समारोह को देखने के लिए है

func Sqrt(x float64) (z float64) { 
    z = x 
    for i := 0; i < 10; i++ { 
     z = z - (z*z - x)/(2*z); 
    } 
    return 
} 
संबंधित मुद्दे