Gorgeous!  Thanks Justin.<div><br></div><div>To speed it up, change the second &quot;101&quot; to &quot;first&quot;</div><div><br></div><div>To speed it up even a little more, you could do this, but it not quite as pretty:</div>
<div><br></div><div><div>(define (euler4e)</div><div>  (for*/fold ([greatest 0])</div><div>    ([first (in-range 101 1000)]</div><div>     [second (in-range first 1000)])</div><div>     (let ([prod (* first second)])</div>
<div>       (if (palindromic? prod)</div><div>         (max greatest prod)</div><div>         greatest))))</div></div><div><br></div><div>Just out of curiosity, have you used for/fold with &gt;1 accum?  It seems very powerful.</div>
<div><br></div><div>thanks again,</div><div>-Joe<br><br><div class="gmail_quote">On Sun, Mar 11, 2012 at 1:33 PM, Justin Zamora <span dir="ltr">&lt;<a href="mailto:justin@zamora.com">justin@zamora.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is a great situation to use Racket&#39;s advanced list<br>
comprehensions.  There is no need to use set!.  You can keep track of<br>
the maximum as you loop.  Here is my solution.<br>
<br>
; Problem 4<br>
; Find the largest palindrome made from the product of two 3-digit numbers.<br>
; 3-digit numbers are the numbers 100-999<br>
(define (pe-004)<br>
  (for*/fold ([greatest 0])<br>
    ([first (in-range 101 1000)]<br>
     [second (in-range 101 1000)]<br>
     #:when (palindrome? (* first second)))<br>
    (max greatest (* first second))))<br>
<br>
Justin<br>
<div><div class="h5"><br>
On Sun, Mar 11, 2012 at 4:12 PM, Joe Gilray &lt;<a href="mailto:jgilray@gmail.com">jgilray@gmail.com</a>&gt; wrote:<br>
&gt; Hi,  I&#39;m redoing the ProjectEuler problems to learn Racket (great fun!).<br>
&gt;  Below are three solutions to PE#4.  Which is most in the spirit of Racket?<br>
&gt;  Of course, I&#39;d love to see solutions that are more idiomatic too.  Is there<br>
&gt; a better way that doesn&#39;t use &quot;for&quot; at all?<br>
&gt;<br>
&gt; Thanks!<br>
&gt; -Joe<br>
&gt;<br>
&gt; ; function that turns a positive integer into a list of digits (in reverse<br>
&gt; order)<br>
&gt; ; invoke as (listize 234511) or (set-count (list-&gt;set (listize 112342)))<br>
&gt; (define (listize num)<br>
&gt;   (if (= num 0)<br>
&gt;       &#39;()<br>
&gt;       (cons (remainder num 10) (listize (quotient num 10)))))<br>
&gt;<br>
&gt; ; function that returns #t if the passed number is palindromic<br>
&gt; ; invoke as (palindromic? n)<br>
&gt; (define (palindromic? n)<br>
&gt;   (if (equal? (listize n) (reverse (listize n))) #t #f))<br>
&gt; )<br>
&gt;<br>
&gt; ; ProjectEuler problem #4<br>
&gt; (define (euler4a)<br>
&gt;   (let ([max 100000])<br>
&gt;     (for ([i (build-list 899 (lambda (x) (+ 100 x)))])<br>
&gt;       (for ([j (build-list (- 999 i) (lambda (y) (+ i y)))])<br>
&gt;         (let ([prod (* i j)])<br>
&gt;           (when (palindromic? prod)<br>
&gt;             (begin<br>
&gt;               (when (&gt; prod max) (set! max prod))<br>
&gt;               (printf &quot;~a * ~a = ~a~n&quot; i j prod))))))<br>
&gt;     (printf &quot;Max palindromic product is ~a~n&quot; max)))<br>
&gt;<br>
&gt; ; ProjectEuler problem #4 using for*<br>
&gt; (define (euler4b)<br>
&gt;   (let ([max 100000])<br>
&gt;     (for* ([i (build-list 899 (lambda (x) (+ 100 x)))]<br>
&gt;            [j (build-list 899 (lambda (y) (+ 100 y)))]<br>
&gt;            #:when (and (&gt;= j i) (palindromic? (* i j))))<br>
&gt;       (let ([prod (* i j)])<br>
&gt;         (when (&gt; prod max) (set! max prod))<br>
&gt;         (printf &quot;~a * ~a = ~a~n&quot; i j prod)))<br>
&gt;     (printf &quot;Max palindromic product is ~a~n&quot; max)))<br>
&gt;<br>
&gt; ; ProjectEuler problem #4 - a mix of 4a and 4b<br>
&gt; (define (euler4c)<br>
&gt;   (let ([max 100000])<br>
&gt;     (for* ([i (build-list 899 (lambda (x) (+ 100 x)))]<br>
&gt;            [j (build-list (- 999 i) (lambda (y) (+ i y)))]<br>
&gt;            #:when (palindromic? (* i j)))<br>
&gt;       (let ([prod (* i j)])<br>
&gt;         (when (&gt; prod max) (set! max prod))<br>
&gt;         (printf &quot;~a * ~a = ~a~n&quot; i j prod)))<br>
&gt;     (printf &quot;Max palindromic product is ~a~n&quot; max)))<br>
&gt;<br>
</div></div>&gt; ____________________<br>
&gt;  Racket Users list:<br>
&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
</blockquote></div><br></div>