Thanks Gary (and Neil and Robby)<div><br></div><div>Very enlightening. аI didn&#39;t know about &quot;when&quot;. аOf course what you said about &quot;set!&quot; and &quot;cond&quot; makes perfect sense. аMinor mods to your code (using your set! elimination idea twice and caching (integer-sqrt x)) gives the code below.</div>
<div><br></div><div>I noticed that I can also remove the define for candidate if I&#39;m willing to call (first candidate-primes) twice. аComments?</div><div><br></div><div>Thanks again!</div><div>-Joe</div><div><br></div>
<div><div>; function to create a list of prime factors of a number</div><div>; invoke as (factor n)</div><div>(define (factor n)</div><div>а (let loop-factors ([facts &#39;()] [x n] [start 2] [end 1000] [candidate-primes (primes-from-to 2 1000)])</div>
<div>а а (define isqrtx (integer-sqrt x))</div><div>а а (cond [(and (empty? candidate-primes) (&gt;= end isqrtx))</div><div>а а а а а а(if (= 1 x) facts (append facts (list x)))]</div><div>а а а а а [else (cond [(empty? candidate-primes)</div>
<div>а а а а а а а а а а а а; attempt to pull in more primes in an efficient manner</div><div>а а а а а а а а а а а а(set! start end)</div><div>а а а а а а а а а а а а(set! end (* 2 end))</div><div>а а а а а а а а а а а а(when (&gt; (* 1.5 end) isqrtx)</div>
<div>а а а а а а а а а а а а а(set! end isqrtx))</div><div>а а а а а а а а а а а а(loop-factors facts x start end (primes-from-to start end))]</div><div>а а а а а а а а а а а [else (define candidate (first candidate-primes))</div>
<div>а а а а а а а а а а а а а а (cond [(zero? (remainder x candidate))</div><div>а а а а а а а а а а а а а а а а а а(loop-factors (append facts (list candidate)) (quotient x candidate) start end candidate-primes)]</div><div>
а а а а а а а а а а а а а а а а а [else</div><div>а а а а а а а а а а а а а а а а а а(loop-factors facts x start end (rest candidate-primes))])])])))</div></div><div><br></div><div><br><br><div class="gmail_quote">On Sun, Feb 19, 2012 at 12:50 PM, Gary Baumgartner <span dir="ltr">&lt;<a href="mailto:gfb@cs.toronto.edu">gfb@cs.toronto.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Applying a lot of what Neil said:<br>
<br>
; function to create a list of prime factors of a number<br>
; invoke as (factor n)<br>
(define (factor n)<br>
</div> а(let loop-factors ([facts &#39;()] [x n] [start 2] [end 1000]<br>
а а а а а а а а а а а а а а а а [candidate-primes (primes-from-to 2 1000)])<br>
а а(cond [(and (empty? candidate-primes) (&gt;= end (integer-sqrt x)))<br>
а а а а а (if (= 1 x) facts (append facts (list x)))]<br>
а а а а а[else (cond [(empty? candidate-primes)<br>
<div class="im"> а а а а а а а а а а а ; attempt to pull in more primes in an efficient manner<br>
а а а а а а а а а а а (set! start end)<br>
а а а а а а а а а а а (set! end (* 2 end))<br>
</div> а а а а а а а а а а а (when (&gt; (* 1.25 end) (integer-sqrt x))<br>
а а а а а а а а а а а а (set! end (integer-sqrt x)))<br>
<div class="im"> а а а а а а а а а а а (set! candidate-primes (primes-from-to start end))<br>
</div> а а а а а а а а а а а (loop-factors facts x start end candidate-primes)]<br>
а а а а а а а а а а а[else (define candidate (first candidate-primes))<br>
а а а а а а а а а а а а а а(cond [(zero? (remainder x candidate))<br>
<div class="im"> а а а а а а а а а а а а а а а а а (set! facts (append facts (list candidate)))<br>
а а а а а а а а а а а а а а а а а (loop-factors facts (quotient x candidate) start end<br>
</div> а а а а а а а а а а а а а а а а а а а а а а а а candidate-primes)]<br>
а а а а а а а а а а а а а а а а а[else<br>
а а а а а а а а а а а а а а а а а (loop-factors facts x start end (rest candidate-primes))])])])))<br>
<br>
When you&#39;re using a lot of &#39;begin&#39;s in &#39;if&#39;s, consider &#39;cond&#39; which has imlicit &#39;begin&#39;.<br>
аAnd for single-branch &#39;if&#39;s [which must be for side-effect], &#39;when&#39; or &#39;unless&#39;.<br>
<br>
As for the &#39;set!&#39;ing: notice, e.g., that<br>
<div class="im"> а а а а а а а а а а а а а а а а а (set! facts (append facts (list candidate)))<br>
а а а а а а а а а а а а а а а а а (loop-factors facts (quotient x candidate) start end<br>
а а а а а а а а а а а а а а а а а а а а а а а а candidate-primes)<br>
</div>аis just<br>
а а а а а а а а а а а а а а а а а (loop-factors (append facts (list candidate))<br>
<div class="im HOEnZb"> а а а а а а а а а а а а а а а а а а а а а а а а (quotient x candidate) start end<br>
а а а а а а а а а а а а а а а а а а а а а а а а candidate-primes)<br>
</div><div class="HOEnZb"><div class="h5">____________________<br>
аRacket Users list:<br>
а<a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>