Próbuję znaleźć najmniejszy nie będący dzielnikiem liczb (https://codegolf.stackexchange.com/questions/105412/find-the-smallest-number-that-doesnt-divide-n). Kolejna wersja używając 'Niech nazwie' działa prawidłowo:Dlaczego pętla jest tak powolna w kodzie Racket
(define (f1 m)
(let loop ((n 2))
(cond
[(= 0 (modulo m n))
(loop (+ 1 n))]
[else n])))
Mam testowanie z:
(f 24)
(f 1234567)
(f 12252240)
(f 232792560)
Przede wersji wywołuje natychmiastowe wyjście: 5 2 19 i 23.
Jednak po wersji która używa wbudowanej pętli for
jest bardzo powolna i faktycznie zawiesza się z powodu błędu braku pamięci przy większych numerach:
(define (f2 m)
(for/first ((i (range 2 m))
#:when (not (= 0 (modulo m i)))
#:final (not (= 0 (modulo m i))))
i))
Czy jest jakiś błąd w kodzie drugiej wersji, czy też jest to for
nieefektywna pętla w porównaniu z nazwaną let in Racket?
Spróbuj zastąpić 'zasięg' przez' in-range'. –
Nie oczekiwałem tak dużej różnicy między zasięgiem a zasięgiem. Jakie są zalety funkcji zasięgu (poza krótszą nazwą)? Dlaczego funkcja zasięgu w ogóle istnieje? – rnso
Ponieważ czasami potrzebujesz listy, a nie sekwencji. 'range' tworzy listę,' in-range' tworzy sekwencję (i dodatkowo współpracuje z 'for' dla poprawy wydajności iteracji). Być może "zasięg" może być dostosowany do współpracy również z 'for'. –