Tôi đang cố gắng tìm số không nhỏ nhất của số (https://codegolf.stackexchange.com/questions/105412/find-the-smallest-number-that-doesnt-divide-n). Sau phiên bản sử dụng 'tên let' hoạt động đúng:Tại sao cho vòng lặp quá chậm trong mã Vợt
(define (f1 m)
(let loop ((n 2))
(cond
[(= 0 (modulo m n))
(loop (+ 1 n))]
[else n])))
Tôi đang thử nghiệm với:
(f 24)
(f 1234567)
(f 12252240)
(f 232792560)
Trên phiên bản sản xuất đầu ra kịp thời: 5 2 19 và 23.
Tuy nhiên, phiên bản sau sử dụng vòng lặp được xây dựng trong for
rất chậm và thực sự gặp sự cố với lỗi lớn hơn với số lớn hơn:
(define (f2 m)
(for/first ((i (range 2 m))
#:when (not (= 0 (modulo m i)))
#:final (not (= 0 (modulo m i))))
i))
Có một số lỗi trong mã của phiên bản thứ hai hoặc là for
vòng lặp không hiệu quả so với tên cho phép trong vợt?
Thử thay thế 'dải ô' bằng' trong phạm vi'. –
Tôi không mong đợi sự khác biệt quá nhiều giữa phạm vi và trong phạm vi. Những lợi thế của chức năng phạm vi (ngoài một tên ngắn hơn) là gì? Tại sao chức năng phạm vi ở đó? – rnso
Bởi vì đôi khi bạn muốn một danh sách, không phải là một chuỗi. 'range' tạo ra một danh sách,' trong phạm vi' tạo ra một chuỗi (và cộng tác với 'for' để cải thiện hiệu năng lặp). Có lẽ 'phạm vi' có thể được điều chỉnh để hợp tác với' for'. –