perl -E 'sub f{say$_[0];f($_[1],$_[0]+$_[1])}f(1,1)' |head -10
If you want to use the & form that saves on stack operations by not creating a new @_, you could do this (paying careful attention to the right to left execution):
perl -E 'sub f{say$_[0];$_[1]=$_[1]+shift;&f}f(1,1)' |head -10
Which is exactly the same length, but less operations. Now if only Perl auto-optimised tail recursion...
It's a shame that unshift doesn't default to @_ like shift otherwise I could save one character by switching the order of the values on the stack:
perl -E 'sub f{say$_[1];unshift@_,$_[0]+pop;&f}f(1,1)' |head -10
Update: I just read the perldoc for goto and I have to say I didn't know that goto &NAME form, so thanks for the learning exercise!. Like my form it won't result in recursive stack blowout. Without studying the internals too carefully I don't know which would result in less operations. Maybe a benchmark will show. |