Recursive Fibonacci Stack Trace
Overview
This overview gives a brief account of how to trace the stack contents while a recursive function executes. The source code is given along with the call tree of the recursive function followed by a step-by-step walk-through of function call stack changes.
Source Code
1 public class Fib{ 2 static int CALLS = 0; 3 4 public static void main(String args[]){ 5 int fn = fib(4); 6 System.out.printf("%d %d\n",fn,CALLS); 7 } 8 public static int fib(int n){ 9 CALLS++; 10 if(n==0){ 11 return 0; 12 } 13 if(n==1){ 14 return 1; 15 } 16 else{ 17 int tmp1 = fib(n-1); 18 int tmp2 = fib(n-2); 19 return tmp1+tmp2; 20 } 21 } 22 }
Call tree for whole computation
Each call starts with value of CALLS
after line 9 of fib()
is run.
+----1:fib(4)-----+ / \ 2:fib(3) 7:fib(2) / \ / \ 3:fib(2) 6:fib(1) 8:fib(1) 9:fib(0) / \ CALLS==8 4:fib(1) 5:fib(1)
Trace of Stack until CALLS
is 8
main() called
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 0 | 128 | ||
… | … | … | … | ||
main() | 4 | args | 5096 | 1024 |
Initial call to fib()
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 0 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 8 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | |||
tmp2 | 0 | 1040 |
CALLS incremented
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 1 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 9 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | |||
tmp2 | 0 | 1040 |
Check n==0
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 1 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 10 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | |||
tmp2 | 0 | 1040 |
Check n==1
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 1 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 13 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | |||
tmp2 | 0 | 1040 |
First Recursive call
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 1 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 8 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | |||
tmp2 | 0 | 1052 |
CALLS incremented again
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 2 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | |||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 9 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | |||
tmp2 | 0 | 1052 |
Next layer of recursion
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 2 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 8 | n | 2 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
CALLS incremented again
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 3 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 9 | n | 2 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
Deepest layer of recursion
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 3 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 17 | n | 2 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | fib(1) | ||
tmp2 | 0 | 1064 | |||
fib() | 8 | n | 1 | 1056 | Return to 1060 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
CALLS incremented
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 4 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 17 | n | 2 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | fib(1) | ||
tmp2 | 0 | 1064 | |||
fib() | 9 | n | 1 | 1056 | Return to 1060 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
Base case n==1 reached
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 4 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 17 | n | 2 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | fib(1) | ||
tmp2 | 0 | 1064 | |||
fib() | 14 | n | 1 | 1056 | Return to 1060 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
Return 1, store in tmp1 at 1060
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 4 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 17 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 |
Next recursive call
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 4 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 18 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 | fib(0) | ||
fib() | 8 | n | 0 | 1068 | Return to 1064 |
tmp1 | 0 | 1072 | |||
tmp2 | 0 | 1076 |
CALLS incremented
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 18 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 | fib(0) | ||
fib() | 9 | n | 0 | 1068 | Return to 1064 |
tmp1 | 0 | 1072 | |||
tmp2 | 0 | 1076 |
Base case n==0 reached
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 18 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 | fib(0) | ||
fib() | 11 | n | 0 | 1068 | Return to 1064 |
tmp1 | 0 | 1072 | |||
tmp2 | 0 | 1076 |
Return 0 to 1065
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 18 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 | fib(0) = 0 |
Return tmp1+tmp2…
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 0 | 1048 | fib(2) | ||
tmp2 | 0 | 1052 | |||
fib() | 19 | n | 2 | 1056 | Return to 1048 |
tmp1 | 1 | 1060 | fib(1) = 1 | ||
tmp2 | 0 | 1064 | fib(0) = 0 |
Return tmp1+tmp2… to 1048
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 17 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 0 | 1052 |
Next layer of recursion
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 5 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 18 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 0 | 1052 | fib(1) | ||
fib() | 8 | n | 1 | 1056 | Return to 1052 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
CALLS incremented
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 18 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 0 | 1052 | fib(1) | ||
fib() | 9 | n | 1 | 1056 | Return to 1052 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
Base case n==1
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 18 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 0 | 1052 | fib(1) | ||
fib() | 14 | n | 1 | 1056 | Return to 1052 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
Return 1 to 1052
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 18 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 1 | 1052 | fib(1) = 1 |
Return tmp1+tmp2
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 0 | 1036 | fib(3) | ||
tmp2 | 0 | 1040 | |||
fib() | 19 | n | 3 | 1044 | Return to 1036 |
tmp1 | 1 | 1048 | fib(2) = 1 | ||
tmp2 | 1 | 1052 | fib(1) = 1 |
Return tmp1+tmp2 to 1036
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 2 | 1036 | fib(3) = 2 | ||
tmp2 | 0 | 1040 |
Next recursive call
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 6 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 2 | 1036 | fib(3) = 2 | ||
tmp2 | 0 | 1040 | fib(2) | ||
fib() | 8 | n | 2 | 1044 | Return to 1040 |
tmp1 | 0 | 1048 | |||
tmp2 | 0 | 1052 |
CALLS incremented
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 7 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 2 | 1036 | fib(3) = 2 | ||
tmp2 | 0 | 1040 | fib(2) | ||
fib() | 9 | n | 2 | 1044 | Return to 1040 |
tmp1 | 0 | 1048 | |||
tmp2 | 0 | 1052 |
Next layer of recursion
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 7 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 2 | 1036 | fib(3) = 2 | ||
tmp2 | 0 | 1040 | fib(2) | ||
fib() | 17 | n | 2 | 1044 | Return to 1040 |
tmp1 | 0 | 1048 | fib(1) | ||
tmp2 | 0 | 1052 | |||
fib() | 8 | n | 1 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |
CALLS reaches 8
Method | Line | Var | Value | Addr | Notes |
---|---|---|---|---|---|
GLOBAL | CALLS | 8 | 128 | ||
… | … | … | … | ||
main() | 5 | args | 5096 | 1024 | |
fn | 0 | 1028 | fib(4) | ||
fib() | 17 | n | 4 | 1032 | Return to 1028 |
tmp1 | 2 | 1036 | fib(3) = 2 | ||
tmp2 | 0 | 1040 | fib(2) | ||
fib() | 17 | n | 2 | 1044 | Return to 1040 |
tmp1 | 0 | 1048 | fib(1) | ||
tmp2 | 0 | 1052 | |||
fib() | 9 | n | 1 | 1056 | Return to 1048 |
tmp1 | 0 | 1060 | |||
tmp2 | 0 | 1064 |