2013-11-11 5 views
1

здесь простой код для вычисления ряда Фибоначчи:Как получить общее количество фреймов стека, используемых в рекурсии в Python?

def fib(n): 
    if n==0 or n==1: 
     return 1 
    else: 
     return fib(n-1)+fib(n-2) 

, если п = 10, я хочу знать, сколько кадры стека задействованы для этого расчета. Есть ли способ получить в реальном времени?

+1

Может быть, это может помочь: http://stackoverflow.com/questions/1156023/print-current-call-stack- in-python – kiasy

ответ

3

Самое простое решение, чтобы добавить дополнительный параметр, затем пропустите его через результат:

def fib(n, depth=1): 
    if n == 0 or n == 1: 
     return (1, depth) 
    else: 
     result1, depth1 = fib(n-1, depth+1) 
     result2, depth2 = fib(n-2, depth+1) 
     return (result1 + result2, max(depth1, depth2)) 

Это вернет число Фибоначчи, сопряженное с глубиной рекурсии.

Тест:

>>> list(map(fib, range(5))) 
[(1, 1), (1, 1), (2, 2), (3, 3), (5, 4)] 
+0

Спасибо, это должно сработать. почему вы используете max (depth1, depth2) –

+0

Это потому, что я предполагал, что вы хотите максимальную глубину рекурсии. Если вы хотите подсчитать количество вызовов, не стесняйтесь изменять его на '+'. –

+0

отлично! Спасибо .. –

2
import inspect 
def fib(n): 
    fib.calls += 1 
    print "depth =", len(inspect.stack()) 
    print "calls =", fib.calls 
    if n == 0 or n == 1: 
     return 1 
    else: 
     return fib(n - 1) + fib(n - 2) 

например

>>> fib.calls = 0 
>>> fib(5) 
depth = 2 
calls = 1 
depth = 3 
calls = 2 
depth = 4 
calls = 3 
depth = 5 
calls = 4 
depth = 6 
calls = 5 
depth = 6 
calls = 6 
depth = 5 
calls = 7 
depth = 4 
calls = 8 
depth = 5 
calls = 9 
depth = 5 
calls = 10 
depth = 3 
calls = 11 
depth = 4 
calls = 12 
depth = 5 
calls = 13 
depth = 5 
calls = 14 
depth = 4 
calls = 15 
8 
+0

В чем разница между глубиной и звонками здесь? разве они не должны быть одинаковыми? –

+0

@ user1988876, «глубина» поднимается и опускается по мере ввода функции и выхода из нее. 'calls' - это просто счет того, сколько раз функция вызывалась. –