#!/usr/bin/perl -w # http://c2.com/cgi/wiki?TailCallOptimization use strict; use Carp qw(cluck); my $cluck = 0; sub _f_tail_rec { if($_[0] == 0) { cluck "Goto optimized stack trace" if $cluck; return $_[1] } $_[1] *= $_[0]; $_[0]--; goto &_f_tail_rec; } sub f_tail_rec { @_ = (@_, 1); goto &_f_tail_rec;} my $n = 100; print "f_tail_rec($n) = ".f_tail_rec($n),"\n"; print "-"x20,"\n"; print "f_normal_rec($n) = ".f_normal_rec($n),"\n"; sub f_normal_rec { if($_[0] == 0) { cluck "Recursion stack trace" if $cluck; return 1; } return $_[0] * f_normal_rec($_[0]-1); }