ssecorp wrote:
def fib(n):
    def fibt(a, b, n):
        if n <= 1:
            return b
        else:
            return fibt(b, a + b, n - 1)
    if n == 0:
        return 0
    else:
        return fibt(0, 1, n);

and can memoization speed up this even more? tesintg with memoization
doesnt really say anything because it is so fast it is instant anyway.

Except for the fact that a+b gets slower as a and b get bigger, this would already be linear time in n. Memoization (here by means of a linear list) only helps if the list is preserved and one makes repeated requests for various fib values.

I am just curious what input you tried that blew the stack? It had to be pretty large.

The stack problem, by the way, is one reason linear induction is usually written in Python with iteration syntax instead of recursion syntax. Another is the extra simplicity.

def fib(n):
  a,b = 1,0
  while n:
    a,b,n = b, a+b, n-1
  return b

A third is the ease of conversion to a (space-efficient) generator function.

def fib_gen()
    a,b = 1,0
    while True:
        yield b
        a,b = b, a+b

The generator it produces can be used, for instance, to fill a list (linear memo) 'on demand'.

A model that leads to the linear algorithm (as opposed to the double recursion derived from Fibonacci's rabbit model) is as follows: A population consists of juveniles and adults. In one period, juveniles become adults (which never die) and adults birth (or bud off) one juvenile. (Yeast are somewhat like this.) At time 0, we start with 1 juvenile and 0 adults. How many adults are there at time n?

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to