2013-02-16 15 views
7

Có vấn đề gì với mã này?Lỗi đã được khai báo và không được sử dụng, khi tôi nghĩ rằng tôi đã làm như vậy với biến số

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: prev tuyên bố và không được sử dụng

+2

Thay vì “có gì sai với mã này” bạn có thể có nghĩa là để hỏi (cụ thể hơn) “tại sao mã này tạo ra lỗi biên dịch này ", đúng? Hãy càng cụ thể càng tốt khi đặt câu hỏi trong tương lai. :) – Kissaki

Trả lời

13

Bạn tuyên bố một biến tên là prev và sau đó không bao giờ sử dụng nó.

Cụ thể, bạn đã nói prev := temp. Điều này đang tạo biến địa phương mới trong phạm vi hiện tại có tên là prev. Tôi giả sử bạn có nghĩa là chỉ cần nói prev = temp, sửa đổi biến số prev được kế thừa từ phạm vi xung quanh. Tương tự, bạn có thể muốn nói curr = curr + prev trên dòng trước đó, thay vì sử dụng :=.

+9

Để xây dựng, '=' gán quyền sang trái, và ': =' tạo một biến * mới * có tên là bên trái, và gán cho nó giá trị của mục ở bên phải. – Kitsune

+0

Cảm ơn! Làm cho cảm giác hoàn hảo. –

2

Nếu bạn thực hiện những thay đổi được đề xuất bởi Kevin Ballard, sau đó,

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()) 
    } 
} 

Output:

1 
2 
3 
5 
8 
13 
21 
34 
55 
89 

Kết quả không phải là Fibonacci sequence.

Đối với 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()) 
    } 
} 

Output:

0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
+1

Để thêm một chút nhỏ, bạn cũng có thể thay thế 'curr = curr + prev' chỉ với' curr + = prev'. Dĩ nhiên, không có sự khác biệt về chức năng - chỉ cần một số lần nhấn phím ít hơn một chút. –

+2

Mặc dù bạn đã sửa mã và cung cấp gợi ý mã chương trình cho chức năng dường như mong muốn của chương trình, bạn không trả lời câu hỏi thực tế * có gì sai với mã */“tại sao nó tạo ra lỗi trình biên dịch”. Đó là lý do tại sao tôi vẫn sẽ bỏ phiếu, mặc dù nó có thể hữu ích trong phạm vi rộng hơn (không thực sự phù hợp với định dạng Q/A này). – Kissaki

+0

Tôi đồng ý và đó thực sự là ý định của tôi để loại bỏ hai số đầu tiên của chuỗi; Tôi chỉ muốn thử nghiệm đóng cửa. Tuy nhiên, điều này có thể hữu ích đối với một số độc giả. –

Các vấn đề liên quan