Last Updated: 2017-05-15 Mon 11:17

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  

Author: Chris Kauffman (kauffman@cs.gmu.edu)
Date: 2017-05-15 Mon 11:17