2013-02-16 9 views
7

पर ऐसा किया है तो इस कोड के साथ क्या गलत है?गो - घोषित और उपयोग नहीं किया गया त्रुटि, जब मुझे लगता है कि मैंने वैरिएबल

package main 

import "fmt" 

// fibonacci is a function that returns 
// a function that returns an int. 
func fibonacci() func() int { 
    prev := 0 
    curr := 1 
    return func() int { 
     temp := curr 
     curr := curr + prev 
     prev := temp 
     return curr 
    } 
} 

func main() { 
    f := fibonacci() 
    for i := 0; i < 10; i++ { 
     fmt.Println(f()) 
    } 
} 

prog.go: 13: पिछला घोषित कर दिया और

+2

"क्यों इस कोड को इस संकलक त्रुटि उत्पन्न करता है ", सही? भविष्य में प्रश्न पूछते समय कृपया यथासंभव विशिष्ट हो। :) – Kissaki

उत्तर

13

इस्तेमाल नहीं किया आप prev नामक एक चर घोषित है और फिर इसे इस्तेमाल कभी नहीं किया।

विशेष रूप से, आपने prev := temp कहा। यह prev नामक मौजूदा दायरे में एक नया स्थानीय चर बना रहा है। मुझे लगता है कि आप केवल prev = temp कहने का मतलब है, जो आसपास के दायरे से prev वैरिएबल विरासत में संशोधित करता है। इसी प्रकार आप शायद := का उपयोग करने के बजाय पिछली पंक्ति पर curr = curr + prev कहने का मतलब रखते थे।

+9

विस्तृत करने के लिए, '=' बाईं ओर दाईं ओर निर्दिष्ट करता है, और ': =' बाईं ओर नामित एक * नया * चर बनाता है, और इसे दाईं ओर आइटम का मान निर्दिष्ट करता है। – Kitsune

+0

धन्यवाद! सही समझ में आता है। –

2

आप परिवर्तनों Kevin Ballard, तो ने सुझाव दिया,

package main 

import "fmt" 

// fibonacci is a function that returns 
// a function that returns an int. 
func fibonacci() func() int { 
    prev := 0 
    curr := 1 
    return func() int { 
     temp := curr 
     curr = curr + prev 
     prev = temp 
     return curr 
    } 
} 

func main() { 
    f := fibonacci() 
    for i := 0; i < 10; i++ { 
     fmt.Println(f()) 
    } 
} 

आउटपुट करते हैं:

1 
2 
3 
5 
8 
13 
21 
34 
55 
89 

उत्पादन Fibonacci sequence नहीं है।

Fibonacci sequence के लिए,

package main 

import "fmt" 

func fibonacci() func() int { 
    a, b := 0, 1 
    return func() (f int) { 
     f, a, b = a, b, a+b 
     return 
    } 
} 

func main() { 
    f := fibonacci() 
    for i := 0; i < 10; i++ { 
     fmt.Println(f()) 
    } 
} 

आउटपुट:

0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
के बजाय "क्या इस कोड के साथ गलत क्या है" आप शायद (अधिक विशेष रूप से) पूछना करने के लिए होती
+1

एक छोटा सा बिट जोड़ने के लिए, आप 'curr = curr + prev' को' curr + = prev' के साथ भी बदल सकते हैं। निश्चित रूप से कोई कार्यात्मक अंतर नहीं है - बस थोड़ा कम कीस्ट्रोक। –

+2

यद्यपि आपने कोड को ठीक किया है और कार्यक्रम की प्रत्याशित कार्यक्षमता के लिए एक प्रोग्राम कोड सुझाव प्रदान किया है, आपने वास्तविक प्रश्न का उत्तर नहीं दिया * कोड के साथ क्या गलत है */"यह उस कंपाइलर त्रुटि का उत्पादन क्यों करता है"। यही कारण है कि मैं अभी भी इसे कम वोट दूंगा, भले ही यह व्यापक क्षेत्र में उपयोगी हो (जो वास्तव में इस क्यू/ए प्रारूप में फिट नहीं है)। – Kissaki

+0

मैं सहमत हूं, और वास्तव में अनुक्रम की पहली दो संख्याओं को छोड़ना मेरा इरादा था; मैं सिर्फ बंद करने का परीक्षण करना चाहता था। फिर भी, यह कुछ पाठकों के लिए सहायक हो सकता है। –

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