in reply to recursion basics
Perhaps a diagram will help.
print "main start\n"; &mySub(4); print "main end\n"; sub mySub { my ($oldValue, $callDepth, @leftOvers) = @_; if (!defined $oldValue) { $oldValue = 0; } if (!defined $callDepth) { $callDepth = 0; } # Increment call depth each time we get into mySub() $callDepth++; my $indentSize = $callDepth * 2; my $indentSpaces = sprintf("%${indentSize}s", ""); # Show we've arrived -- indent according to call depth print "${indentSpaces}mySub($oldValue) BEGIN\n"; # Cut value in half and recurse until zero my $newValue = int($oldValue / 2); if ($newValue > 0) { &mySub($newValue, $callDepth); } # Show we've returned -- indent according to call depth print "${indentSpaces}mySub($oldValue) END\n"; # Bye-bye return; }
Results:
main start mySub(4) BEGIN mySub(2) BEGIN mySub(1) BEGIN mySub(1) END mySub(2) END mySub(4) END main end
Diagram of how it works (conceptually, if not implementorily):
| main start |
main() mySub()
^ | +-- You are here You call mySub(4) |
| mySub(4) BEGIN |
main() mySub(4)
^ | +-- You are here You call mySub(2) |
| mySub(2) BEGIN |
main() mySub(4)
mySub(2) ^ | +-- You are here You call mySub(1) |
|
mySub(1) BEGIN
mySub(1) END |
main() mySub(4)
mySub(2) mySub(1) ^ | +-- You are here |
| mySub(2) END |
main() mySub(4)
mySub(2) ^ | +-- You are here |
| mySub(4) END |
main() mySub(4)
^ | +-- You are here |
| main end |
main() mySub()
^ | +-- You are here |
|
|---|