Recursion and Variable Scope
Doug Landauer
landauer at apple.com
Fri Sep 7 13:56:30 EDT 2001
In article <9n9vln072d at enews1.newsguy.com>, "Alex Martelli"
<aleax at aleax.it> wrote:
[... A very good exposition ...]
>
> Personally, I find it clearest to frame such enumeration
> problems as "counting in a certain base"...
Here are the two silly versions that I came up with last night,
using that theme ... they probably won't work for sides > 9.
def ib ( i, b ):
if i<b: return `i`
return ib(i/b,b) + `i%b`
def ibx ( i, b, d ):
ibr = ib(i,b)
while len(ibr) < d: ibr= '0'+ibr
return ''.join( [ chr( ord(ch)+1 ) for ch in ibr ] )
def dicide1 ( sides, dice ):
""" silly version, too bad it needs the "ib" aux function. """
lows= '0'*dice
return [ [ int(ch) for ch in ibx(nr,sides,dice) ] \
for nr in range(int(lows,sides), int('1'+lows,sides) ) ]
def dicide2 ( sides, dice ):
""" way silly version, slower. """
lows= '0'*dice
return filter( lambda lst, d=dice: len(lst) == d,
[ [ int(ch) for ch in `nr` if ch in '123456789'[:sides] ] \
for nr in range(int(lows), int('1'+lows) ) ]
)
def seeThem () :
print '\nThis just counts in base "dice" ...'
print 'dicide1:'
print dicide1( 4, 2 )
print '\nThis counts in base ten, and throws many away ...'
print 'dicide2:'
print dicide2( 4, 2 )
--
Doug Landauer landauer at got dot net
More information about the Python-list
mailing list