where the function has problem? n = 900 is OK , but n = 1000 is ERROR
Dave Angel
davea at ieee.org
Mon Aug 1 07:15:20 EDT 2011
On 01/-10/-28163 02:59 PM, jc wrote:
> # Get Fibonacci Value
> # Fibonacci(N) = Fibonacci(N-1) + Fibonacci(N-2)
> #
> # n = 900 is OK
> # n = 1000 is ERROR , Why
> #
> # What Wrong?
> #
>
> cache = []
>
> def fibo( n ):
>
> try:
> if cache[n] != -1:
> return cache[n]
> else:
> if 0 == n:
> r = 0
> elif 1 == n:
> r = 1
> else:
> r = fibo(n-1) + fibo(n-2)
>
> cache[n] = r
> return r
> except:
> print "EXCEPT: " + str(n)
>
>
> if __name__ == '__main__':
>
> # This n = 900 is OK
> # But n = 1000 is ERROR
>
> n = 900
> cache = range(0 , n + 1 , 1)
>
> for i in cache:
> cache[i] = -1
>
> print "Fibo(" + str(n) + ") = " + str(fibo(n))
> print "\n"
> print "\n"
>
>
It'd be really nice if you bothered to state what "ERROR" you get. Show
the traceback or since the output is pretty long, at least show part of
it. copy/paste it from the shell.
In any case, it's clearly a recursion problem, due to the default limit
of the CPython stack (1000). This succeeds for 999, and gets a stack
overflow at 1000.
A solution that lets you go much higher would be to insert before the lines:
if cache[n] != -1:
return cache[n]
The following:
if n > MAXDEPTH:
if n%MAXDEPTH:
for i in xrange(0, n, 200):
fibo(i) #calc value just to prefill the cache
where an easy value for MAXDEPTH is 200.
Think about what this does, and you should see why it'll help.
I tried it for 100,000 and it doesn't blow up. I didn't however check
any of the other logic.
DaveA
More information about the Python-list
mailing list