Dick Moores wrote: > http://www.rcblue.com/Python/changeMaker_revised_for_US_denominations.py > > I'm still working at Python--been at it a while--and thought the > script was ingenious. Do the Tutors agree? Or is it just > run-of-the-mill programming? Could it have been more simply written?
I don't find it either ingenious or well-written. The algorithm is the same one you would use to count out an amount by hand so it doesn't seem so unusual. IMO the code relies too much on indices. If you rewrite it using a dict (or, even better, defaultdict(int)) for coinCount, there is no need for indices at all. Even with coinCount as a list, it could be better written. coinCount = [] for d in denominations: coinCount.append(0) => coinCount = [0] * ndenominations The main loop could be for deno in range(ndenominations): if not remaining: break or for i, deno in enumerate(denominations): # i is now the index, deno is the actual denomination but I would write it this way and avoid the use of the index completely: from collections import defaultdict coinCount = defaultdict(int) remaining = change # Loop until either we have given all the change or we have # run out of coin denominations to check. for deno in denominations: if not remaining: break # For one denomination, count out coins of that denomination # as long as the remaining amount is greater than the denomination # amount. while remaining >= deno: coinCount[deno] += 1 print "remaining =", remaining remaining -= deno # Report the results. print "Your change is $%.02f"% (float(change) / CPD) for deno in denominations: if coinCount[deno] > 0: if deno >= 100: print "$%d bills:\t" % (deno / CPD), coinCount[deno] else: print "%d-cent coins:\t" % (deno), coinCount[deno] Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor