[Tutor] learning recursion

rakesh sharma rakeshsharma14 at hotmail.com
Sat Feb 8 10:58:52 CET 2014


Hi
I guess I need to revisit my maths lessons.Thank you for correcting me. 
thanks,rakesh

> From: dyoo at hashcollision.org
> Date: Sat, 8 Feb 2014 00:20:19 -0800
> Subject: Re: [Tutor] learning recursion
> To: rakeshsharma14 at hotmail.com
> CC: davea at davea.name; tutor at python.org
> 
> On Fri, Feb 7, 2014 at 9:05 PM, rakesh sharma
> <rakeshsharma14 at hotmail.com> wrote:
> > Hi
> >
> > Shouldn't your code be like this
> >
> > def fib(n):
> > if n==0:
> > return 0
> > else:
> > return n + fib(n-1)
> 
> 
> Hi Rakesh,
> 
> Unfortunately, no, because this computes a slightly different
> function: the triangular numbers!  :P
> 
> 
> That is, your function above is an implementation for the sum:
> 
>     0 + 1 + 2 + ... + n
> 
> It's also known as a "Gauss sum".
> 
> 
> ##################################################################
> 
> [Tangent ahead.  Skip if you're not interested.]
> 
> As a very tangent note, it's good for us programmers to know about
> this function, because it shows up in some common places.  For
> example, it occurs when we try to figure out approximately how long it
> takes to concatenate a bunch of strings in a naive way.
> 
> Imagine the following artificial scenario:
> 
> #############################
> long_string = ""
> for n in range(1000):
>     long_string = long_string + "X"
> #############################
> 
> where we're building up a large string with repeated concatenations.
> 
> Does this look bad to you?  It should!  The string concatenation
> operation takes time that's proportional to the size of the string
> we're building up.  If we do the above, with _repeated_ string
> concatenation, going through the whole loop will cost, altogether,
> something on the order of:
> 
>     0 + 1 + 2 + ... + 1000
> 
> elementary operations, representing the first, second, ... and
> thousandth time through that loop.
> 
> And if you know your Gauss sum, this sum can be quickly computed
> without having to do each individual addition:
> 
>     0 + 1 + 2 + ... + 1000
>         = (1000 * 1001) / 2
>         = 500500
> 
> which is a fairly big number.
> 
> In general:
> 
>     0 + 1 + 2 + ... + n
>         = n * (n+1) / 2
> 
> In practice, this means for us programmers that if we're going to
> build up a large string in parts, doing repeated string concatenation
> is not the right approach as it means we're doing things in quadratic
> time.  It's better to build up a list of strings, and then do the
> concatenation all at once, avoiding the repeating rebuilding of a
> larger and larger string:
> 
> #############################
> long_string_chunks = []
> for n in range(1000):
>     long_string_chunks.append("X")
> long_string = "".join(long_string_chunks)
> #############################
> 
> where the "".join(...) part, having been implemented well, and knowing
> all the long_string_chunk elements, can do the string concatenation in
> one single, efficient pass.
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20140208/7fcfb648/attachment.html>


More information about the Tutor mailing list