[Tutor] exercise is recursion
DMan
dsh8290@rit.edu
Tue, 21 Nov 2000 09:50:35 0500
On Tue, 21 Nov 2000 09:22:25 Moshe Zadka wrote:
 On Tue, 21 Nov 2000, Remco Gerlich wrote:

 > I would write it like this:
 >
 > import math
 >
 > def factors(n, highestsofar=2):
 > for i in range(highestsofar, math.sqrt(n)+1):
 > if n % i == 0:
 > return [i] + factors(n/i, i)
 > return [n]

 def factors(n, highestsofar=2, factorssofar=None):
 if factorssofar is None:
 factorssofar = []
 for i in range(highestsofar, math.sqrt(n)+1):
 if n % i == 0:
 factorssofar.append(i)
 return factors(n/i, i, factorssofar)
 factorssofar.append(n)
 return factorssofar

 Is more efficient, and almost as clear.

Why not
def factors( n , highestsofar=2 , factorssofar=[] ) :
...
Then when the client calls it
result = factors( number , factorssofar=[] )
The list will be empty. One less arg to pass in the recursion and also removes
the need for the "if ( factorssofar == None )" check. (I know the default arg
is only evaluated once, but that can be useful in this case)
 
 Moshe Zadka <moshez@math.huji.ac.il>  95855124
 http://advogato.org/person/moshez

Does python do tailrecursion yet? If so, then Moshe's is definitely more
efficient (read better). If not, I think the previous solution is easier to
read, but both are quite clear.
Just my $0.02.
D