hi! `recursion' means `memory' (i.e. stack) I'm sure there is few line-recursive function that could do the trick but this is not the point, the point is that you cannot do this without memory and then you better use arrays :)
P! Vladi. Greg Bacon wrote: > > In message <3C074313.2038.6FC2633@localhost>, > "Keith C. Ivey" writes: > > : Greg Bacon <[EMAIL PROTECTED]> wrote: > : > : > You have a finite sequence of unknown length, where each > : > element in the sequence is a string. Output the middle > : > element of the sequence (for a reasonable definition of > : > middle), traversing the sequence at most once and without > : > storing the elements in an array. > : > : Okay, you've clarified what the input is like. Now we need > : clarification of what "without storing the elements in an > : array" means. > : > : Does "the elements" mean "all the elements" or "any elements"? > : Does "an array" mean you can store whatever elements you want, > : as long as you don't use a Perl array to do it? > > I give up. :-) > > Here's my solution (which is similar but less elegant than the one > Ian sent): > > #! /usr/local/bin/perl > > use warnings; > use strict; > > sub usage { "Usage: $0 file\n" } > > sub midline { > my $fh = shift; > my $lnum = shift || 1; > my $sub = shift || sub { undef }; > > my $line = <$fh>; > > if (defined $line) { > my $next = sub { > my $n = shift; > > if ($n == $lnum) { > return $line; > } > else { > return $sub->($n); > } > }; > > midline($fh, $lnum+1, $next); > } > else { > $sub->(int $lnum/2); > } > } > > die usage unless @ARGV == 1; > my $file = shift; > my $fh; > > open $fh, $file or die "$0: open $file: $!\n"; > > my $mid = midline($fh) || "<undefined>\n"; > print $mid; > > To answer Vladi: yes, magic is needed, i.e., recursion. > > Greg -- Vladi Belperchinov-Shabanski <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> Personal home page at http://www.biscom.net/~cade DataMax Ltd. http://www.datamax.bg Too many hopes and dreams won't see the light...
smime.p7s
Description: S/MIME Cryptographic Signature