Важно отметить, что это не параллельный / параллельный алгоритм, поэтому возможная визуализация шагов, выполняемых для вычисления выходных данных функции, не является одновременной.
Если переписать алгоритм следующим образом, это может сделать это более очевидным:
int f(int n) {
if (n <= 0) {
return 1;
}
int temp1 = f(n - 1);
int temp2 = f(n - 1);
return temp1 + temp2;
}
Таким образом, вызовы первого f(n - 1)
и второго f(n - 1)
не происходят одновременно.
Это означает, что в любой данный момент весли у нас есть линейный стек вызовов, подобный этому:
f(3)
/
f(2)
/
f(1)
/
f(0)
В данный момент у нас есть стек вызовов размером 4. Когда вычисляется f(0)
, последний элемент элемента извлекается из стека.и у нас будет стек вызовов размером 3:
f(3)
/
f(2)
/
f(1)
На этом этапе алгоритм оценивает второй вызов f(1)
(правое поддерево f(1)
):
f(3)
/
f(2)
/
f(1)
\
f(0)
У нас снова есть стек вызовов размером 4. На следующих нескольких шагах стек вызовов преобразуется в:
f(3)
/
f(2)
/
f(1)
, а затем:
f(3)
/
f(2)
и затем:
f(3)
/
f(2)
\
f(1)
, а затем:
f(3)
/
f(2)
\
f(1)
/
f(0)
и т. Д.ru:
f(3)
/
f(2)
\
f(1)
, а затем:
f(3)
/
f(2)
\
f(1)
\
f(0)
, и этот процесс продолжается до завершения алгоритма.
Следовательно, мы можем заключить, что сложность пространства дляалгоритм: O (ч) .