Stephen, Gary, et al,

Thanks for the suggestions.  Below is the code I've been playing with
today.  I'd love any and all suggestions.  I've been coding in Racket for
about a week so I'm sure there is a lot a grist for the mill below!

-Joe

; function that returns a list of all integers between the two arguments
inclusive
(define  (interval-list m n)
  (if (> m n)
      '()
      (cons m (interval-list (+ 1 m) n))))

; sieve of erostosthenes
(define (sieve lst)
  (define (remove-multiples n lst)
    (if (null? lst) '()
        (if  (= (modulo (car lst) n) 0)
             (remove-multiples n (cdr lst))
             (cons (car lst)
                   (remove-multiples n (cdr lst))))))
  (if (null? lst) '() (cons (car lst) (sieve (remove-multiples (car lst)
(cdr lst))))))

; wrapper function for sieve, saves a list of primes for future calls
(define primes-from-to
  (let ([lastend 0] [storedlst '()])
    (lambda (start end)
      (cond [(<= lastend start) (set! storedlst (sieve (append storedlst
(interval-list start end))))]
            [(< lastend end) (primes-from-to lastend end)])

      ; storedlst now has all the primes needed
      (if (< lastend end) (set! lastend end) #f)
      (filter (lambda (v) (and (<= start v) (<= v end))) storedlst))))

; function to create a list of prime factors of a number
; invoke as (factor n)
(define (factor n)
  (let loop-factors ([facts '()] [x n] [start 2] [end 1000]
[candidate-primes (primes-from-to 2 1000)])
    (if (and (eq? candidate-primes empty) (>= end (integer-sqrt x)))
        (if (= 1 x) facts (append facts (list x)))
        (begin
          (if (eq? candidate-primes empty)
              (begin
                ; attempt to pull in more primes in an efficient manner
                (set! start end)
                (set! end (* 2 end))
                (if (or (> end (integer-sqrt x)) (> (* 1.25 end)
(integer-sqrt x))) (set! end (integer-sqrt x)) #f)
                (set! candidate-primes (primes-from-to start end))) #f)
          (if (eq? candidate-primes empty)
              (if (= 1 x) facts (append facts (list x)))
              (let ([candidate (first candidate-primes)])
                (if (= 0 (remainder x candidate))
                    (begin
                      (set! facts (append facts (list candidate)))
                      (loop-factors facts (quotient x candidate) start end
candidate-primes))
                    (loop-factors facts x start end (rest
candidate-primes)))))))))



On Sat, Feb 18, 2012 at 6:02 PM, Stephen Bloch <[email protected]> wrote:

>
> On Feb 18, 2012, at 2:42 PM, Gary Baumgartner wrote:
>
> >>       (filter (lambda (v) (if (and (>= v start) (<= v end)) #t #f))
> >>   storedlst)
> >>       )))
> > [...]
> >
> > Consider just (lambda (v) (and (>= v start) (<= v end))) --- no 'if'.
>
> I see a lot of my students doing this -- in whatever language -- because
> they think of Booleans as a way to decide which of two things to DO, rather
> than as legitimate values in their own right.  In fact, the whole world of
> expressions is a bit of a foreign country -- a sort of "adjunct" to the
> more-legitimate world of statements.
>
> if (blah == true) {
>   return true;
>   }
> else {
>  return false;
>  }
>
> For those of us forced to teach in Java, CheckStyle has two modules,
> SimplifyBooleanExpression and SimplifyBooleanReturn, that catch things like
> this.
>
>
> Stephen Bloch
> [email protected]
>
>
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users
>
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to