sách gpt4 ai đã đi

Tại sao mã này lại lỗi?

In lại Tác giả: IT Prince Thời gian cập nhật: 2023-10-29 01:40:18 26 4
mua khóa gpt4 Nike

Tôi đã viết một số mã lệnh theo phong cách FP để tạo ra các số nguyên tố:

gói chính
nhập khẩu (
"fmt"
)

hàm gen_number_stream() hàm() (int, bool) {
tôi := 1
trả về func() (int, bool) {
tôi += 1
trả về i, đúng
}
}

hàm lọc luồng(luồng hàm() (int, bool), f hàm(int) bool) hàm() (int, bool) {
trả về func() (int, bool) {
đối với i, ok := stream(); ok; i, ok = stream() {
nếu f(i) {
trả về i, đúng
}
}
trả về 0, sai
}
}

func sieve(stream func() (int, bool)) func() (int, bool) {
trả về func() (int, bool) {
nếu p, ok := stream(); ok {
còn lại := filter_stream(stream, func(q int) bool { return q % p != 0 })
dòng = sàng (còn lại)
trả về p, đúng
}
trả về 0, sai
}
}


func take(stream func() (int, bool), n int) func() (int, bool) {
trả về func() (int, bool) {
nếu n > 0 {
n-= 1
trả về luồng()
}
trả về 0, sai
}
}

hàm main() {

số nguyên tố := lấy(sàng(gen_number_stream()), 50)

với i, ok := số nguyên tố(); ok; i, ok = số nguyên tố() {
fmt.Println(i)
}

}

Khi tôi chạy đoạn mã này, nó ngày càng chậm hơn và cuối cùng tôi nhận được lỗi thời gian chạy như thế này:

thời gian chạy: hết bộ nhớ: [...]

Sau đây là phiên bản mã Python hoạt động tốt:

định nghĩa gen_numbers():
tôi = 2
trong khi Đúng:
năng suất i
tôi += 1

def sieve(stream):
p = luồng.next()
năng suất p
đối với i trong sàng (i đối với i trong luồng nếu i % p != 0 ):
năng suất i

def take(stream,n):
đối với i,s trong enumerate(stream):
nếu tôi == 50: ngắt
mang lại

định nghĩa main():
đối với i trong take(sieve(gen_numbers()),50):
in tôi


nếu __name__ == '__main__':
chủ yếu()

Tôi muốn biết lý do và cách khắc phục. Có phải do mã của tôi hay trình biên dịch Golang có vấn đề không? Cảm ơn!

PS: Xin lỗi vì tiếng Anh của tôi không tốt.

1 Câu trả lời

Vấn đề nằm ở hàm lọc đệ quy của bạn. Tôi nghi ngờ rằng bạn đang làm hỏng ngăn xếp bằng cách liên tục gọi hàm sieve một cách đệ quy trong một vòng lặp.

func sieve(stream func() (int, bool)) func() (int, bool) {
trả về func() (int, bool) {
nếu p, ok := stream(); ok {
còn lại := filter_stream(stream, func(q int) bool { return q % p != 0 })
stream = sieve(remaining) // chỉ tiếp tục gọi sieve một cách đệ quy, cuối cùng sẽ làm hỏng ngăn xếp của bạn.
trả về p, đúng
}
trả về 0, sai
}
}

Tại sao mã này lại lỗi? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12071040/

26 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com