<div dir="ltr"><font size="4">Hi everyone,</font><div><font size="4"><br></font></div><div><font size="4">I need some advice on how to do something.  Let's say that I want to print out the Cartesian product of the integers 1 to 4.  It would look something like this:</font></div><div><font size="4"><br></font></div><div><font size="4">1, 1, 1, 1</font></div><div><font size="4">1, 1, 1, 2</font></div><div><font size="4">1, 1, 1, 3</font></div><div><font size="4">1, 1, 1, 4</font></div><div><font size="4">1, 1, 2, 1</font></div><div><font size="4">1, 1, 2, 2</font></div><div><font size="4">1, 1, 2, 3</font></div><div><font size="4">1, 1, 2, 4</font></div><div><font size="4">1, 1, 3, 1</font></div><div><font size="4">1, 1, 3, 2</font></div><div><font size="4">1, 1, 3, 3, etc, etc until finally we have</font></div><div><font size="4">..............</font></div><div><font size="4">4, 4, 4, 3</font></div><div><font size="4">4, 4, 4, 4</font></div><div><font size="4"><br></font></div><div><font size="4">This is NOT a permutation because repetition is allowed.  Nor is it a combination because for example 1, 1, 1, 2 is distinct from 2, 1, 1, 1.  I believe this is technically called a Cartesian product.</font></div><div><font size="4"><br></font></div><div><font size="4">I know of two ways to do this:</font></div><div><font size="4"><br></font></div><div><font size="4">Method #1:</font></div><div><font size="4"><br></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>for a in range(1, 5):</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>     for b in range(1, 5):</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>          for c in range(1, 5):</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>                for d in range(1, 5):</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>                      print( a, end = ", " )</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>                      print( b, end = ", " )</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>                      print( c, end = ", " )</b></font></div><div><font size="4" face="georgia, serif" color="#20124d"><b>                      print( d, end = "\n" )</b></font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">The above works just fine!  But there's a problem.  What if let's say I want the Cartesian product of all the integers from 1 to 10?  That means working with 10 nested for-loops!  That's insane!  It's tedious to write and probably even worse for the person who is reading it.  So this method is limited to smaller examples.</font></div><div><font size="4"><br></font></div><div><font size="4">Method #2:</font></div><div><font size="4"><br></font></div><div><font size="4">Cheat by using Python's itertools package!  (Or is it a library?  What's the difference between a package and a library?)</font></div><div><font size="4"><br></font></div><div><font size="4">import itertools</font></div><div><font size="4"><br></font></div><div><font size="4">carProduct = itertools.product([1, 2, 3, 4], repeat = 4)</font></div><div><font size="4"><br></font></div><div><font size="4" color="#20124d" face="georgia, serif"><b>try:</b></font></div><div><font size="4" color="#20124d" face="georgia, serif"><b>     while True:</b></font></div><div><font size="4" color="#20124d" face="georgia, serif"><b>               print( next(carProduct) )</b></font></div><div><font size="4" color="#20124d" face="georgia, serif"><b>except StopIteration:</b></font></div><div><font size="4" color="#20124d" face="georgia, serif"><b>      pass</b></font></div><div><font size="4"><br></font></div><div><font size="4">This method is short and sweet!  It works great!  But it's really cheating in the sense that the programmer is taking advantage of code that has already been written.  (I have nothing against doing that!  But in a CS class if I write down that answer on an exam do you think the professor is going to give me any credit?  Probably not!!!  LOL! )</font></div><div><font size="4"><br></font></div><div><font size="4">Is there some other way?  I'm guessing that I would need a for-loop that contains a recursive function.  Or.... maybe a recursive function that contains a for-loop?  I really don't know.  I've been struggling with this for a couple days now and I can't think of a solution.  Can someone please enlighten me?</font></div><div><font size="4"><br></font></div><div><font size="4">Gratefully,</font></div><div><font size="4"><br></font></div><div><font size="4">Douglas.</font></div><div><font size="4"><br></font></div></div>