cool

Peter Scott Peter at PSDT.com
Mon Feb 3 17:16:17 CST 2003


At 03:10 PM 2/3/03 -0800, nkuipers wrote:
>Yes you are right, this case is just as effectively solved 
>non-recursively and
>the reminder not to get carried away is well received.  If I were to chide
>your solution however, I might say that it is very difficult to read 
>to anyone
>not familiar with a breadth of perl idioms, everything from shift and qw()
>which I also used, to preceding parens with + for making something not look
>like a function call (if I remember correctly), => comma equivalence, 
>and some
>rather heavy operator chaining.
>
>;)

See, it's not just a function but a tutorial! :-)

Okay, perhaps you'd prefer:

sub makeDNA {
   my $count = shift;
   my @bits = qw(A C G T);
   my $res;
   for (1 .. $count) {
     $res .= $bits[rand @bits];
   }
   return $res;
}


>nathanael
>
>
> >===== Original Message From Peter Scott <Peter at PSDT.com> =====
> >At 12:58 PM 2/3/03 -0800, nkuipers wrote:
> >>I played around in recursion a bit, wanting to get the practice but
> >>also to do
> >>something useful.  So I framed it to myself as an exercise.  This was
> >>my first
> >>idea:
> >>[snip]
> >>sub makeDNA {
> >>         my $n = shift;
> >>         my @alphabet = qw( A C G T);
> >>         if ($lengthRemaining == 0)
> >>         {
> >>                 return;
> >>         }
> >>         print $alphabet[int(rand(4))];
> >>         makeDNA($n - 1);
> >>}
> >>
> >>makeDNA(10);
> >>print "\n";
> >>
> >>This could develop into a small host of other recursive, random
> >>functionalities useful for bioinformatics, such as taking a sequence and
> >>randomly mutating n residues.  I will be incorporating above subroutine and
> >>possibly others in my BIO::Basic module.
> >
> >Well, hold on a second... fun as recursion may be, it is not a
> >panacea.  It is only optimal in the cases where you really do find
> >yourself wanting to call the same function from within itself.  I
> >suggest familiarizing yourself with a number of classic uses of
> >recursion before deciding to use it.  Look for: The Tower of Hanoi,
> >Ackerman's function, and anything to do with parsing a stream which may
> >be lexically recursive in some fashion.
> >
> >I'd write yon function above as
> >
> >sub makeDNA
> >{
> >   join '' => map +(qw(A C G T))[rand 4] => 1 .. shift;
> >}
> >
> >In general, don't print from inside utility functions.  Return strings
> >instead so you can either print them or decide to do something else
> >with them (e.g., run them through tests).
> >
> >--
> >Peter Scott
> >Pacific Systems Design Technologies
> >http://www.perldebugged.com/

--
Peter Scott
Pacific Systems Design Technologies
http://www.perldebugged.com/




More information about the Victoria-pm mailing list