We can draw a recursion trace, where we have a box for each recursive call, an arrow from each caller to callee and an arrow from each callee to caller showing return value.

Here’s an example of the Factorial Function:

digraph {
	start [shape=point]
	4 [label="factorial(4)"]
	3 [label="factorial(3)"]
	2 [label="factorial(2)"]
	1 [label="factorial(1)"]
	0 [label="factorial(0)"]
 
	start->4 [label=" call"]
	4->3 [label=" call"]
	3->2 [label=" call"]
	2->1 [label=" call"]
	1->0 [label=" call"]
 
	0->1 [label=" return 1"]
	1->2 [label=" return 1"]
	2->3 [label=" return 2"]
	3->4 [label=" return 6"]
	4->start [label=" return 24"]
}