[racket] Generating Tuples from List
So... that's exactly what you'd do if you didn't have for* macros. Using
for* macros and turning the false branch into a helper function results
in this:
;; product : (listof a) (listof b) -> (listof (cons a b))
(define (product lst1 lst2)
(for*/list ([x (in-list lst1)]
[y (in-list lst2)])
(cons x y)))
;; tuples : (listof a) natural -> (listof (listof a))
(define (tuples lst n)
(cond [(= n 0) (list empty)]
[else (product lst (tuples lst (- n 1)))]))
You'd want error checking or a contract on `tuples', of course.
Neil ⊥
On 02/29/2012 08:32 PM, Adam Shaw wrote:
> (define (tuples xs n)
> (if (<= n 0)
> (list empty)
> (foldr append empty (map (λ (t) (map (λ (x) (cons x t)) xs)) (tuples xs
> (sub1 n))))))
>
>
> On Feb 29, 2012, at 8:52 PM, Ashok Bakthavathsalam wrote:
>
>> Again, trying to mimic something available in Mathematica (Tuples -
>> Wolfram Mathematica 8 Documentation http://bit.ly/AgsIym).
>> How can this be accomplished in Racket? Here's an example from the
>> Mathematica documentation.
>> All possible 3-tuples of and :
>> In[1]:= <http://reference.wolfram.com/mathematica/ref/Tuples.html>
>> Click for copyable input
>> <http://reference.wolfram.com/mathematica/ref/Tuples.html>
>>
>> Out[1]=
>>
>>
>> No, this is not homework. So, would appreciate code if available.
>>
>> Thanks,
>>
>> % ashok
>>
>> ____________________
>> Racket Users list:
>> http://lists.racket-lang.org/users
>
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users